栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Octave编译遇到的坑

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Octave编译遇到的坑

想用Octave做嵌入计算,可以直接调用.m文件。想法很好,结果遇到了一系列的坑,有的跳出来了,有的还没填上。

首先,看到Octave需要Linux的编译环境,那就先在Linux下试试。正好有DeepIn系统,下了Octave 6.3的源代码,开始尝试。结果一编译,发现DeepIn的好多库与Octave需要的库版本不符,编译不通过。只好从configure的选项中,一个一个屏蔽牵连的模块,最终生成了一个没有图形功能的Octave。经测试,可以嵌入到代码中,执行正常。

其次,想试试Windows下是否能行。先下载了已编译好的Octave二进制代码,按照Linux下的代码再来一遍,也能运行。但是每次在octave::interpreter析构时会报告两个错误,很不爽。搜到很久以前的BUG报告,可能是析构时内部符号表被释放后又使用了,到现在还没修复吗?无论如何,要想躲开这个错误,还是要在Windows下编译Octave。

于是,决定按照Octave Wiki(Building on Microsoft Windows - Octave)的方法,在Windows下用MSYS2编译Octave。按照流程下载了所有需要的库,下载了最新的Octave源代码,然后编译,大概半小时后失败。看输出,是发生在链接生成动态库的最后一步出的错,但是没有任何具体提示,只是说失败了。

为了取得具体的错误信息,干脆用Code::Blocks新建一个工程,把liboctave中的所有源码加入到工程中,在修复了包含路径、包含源文件等问题后,终于到了最后一步,还是没有具体提示地失败了。看到调用命令后面那上百个.o文件,莫不是太多了?于是按照子目录将liboctave拆成7个小库,逐一编译,都成功了。心下大喜,将liboctinterp也拆成小库,逐一编译,全部通过。但是在生成测试程序地时候,就报告一堆找不到符号错误。想骂人,生成库地时候一声不吭,现在爆出来,我对源代码又不熟,哪里知道原因在什么地方。而且有些符号像是线性代数库的,但是添加各种库都不能消除。气晕,放弃吧。

隔天还是不甘心,又把Octave 6.3的源代码放到MSYS下编译,不用最新的了。编译时还是有一堆错,但是好歹有具体原因,大多是找不到符号,就是模块配置的问题。干脆按照Building a minimal Octave CLI only from source on Windows - help - GNU Octave的提法关闭了与计算无关的模块,还是在生成liboctinterp的时候找不到符号,看样子还是一个线性代数库。翻看configure的输出,偶然发现LAPACK库的信息是空的。检查编译器环境下,LAPACK的动态库、静态库全都在,configure的过程中也检测成功了,应该是配置文件的生成过程有问题。懒得慢慢查了,直接改Makefile得了。在生成的Makefile里,LIBOCTINTERP_link_DEPS后面添上-llapack,然后make,编译成功。

编译成功的库用原来的代码测试,问题依旧,还是要改代码。

查到octave::interpreter的shutdown函数,加了一堆打印输出语句,来测试哪一句出的错。结果发现是析构时调用了两次内部函数close all,每次输出一个错误,倒不是什么符号表的问题。这个语句是用来在退出Octave的时候关闭所有的绘图窗口,我嵌入使用,又不需要绘图,果断注释掉。重新编译后再次测试,错误信息消失。

高高兴兴把编译好的库拷出来,吓了一跳,liboctinterp.dll居然有800多MB,liboctave.dll也有200多MB,这俩就1个多GB,这还了得?难道我加的计算库太多了?可那些库都是动态链接的。然后想到应该是调试符号,一查Makefile,果然,所有FLAGS都有-g,全部删除,重新make,都缩小到20多MB,完美。

然后想着能不能再小一点,按照上面网页介绍中最疯狂的做法,关闭几乎所有模块:../configure --disable-docs --disable-fftw-threads --disable-java --disable-jit --disable-openmp --disable-readline --without-amd --without-arpack --without-bz2 --without-camd --without-ccolamd --without-cholmod --without-colamd --without-curl --without-cxsparse --without-fftw3 --without-fftw3f --without-fltk --without-fontconfig --without-framework-opengl --without-freetype --without-glpk --without-hdf5 --without-klu --without-magick --without-opengl --without-openssl --without-osmesa --without-portaudio --without-qhull --without-qrupdate --without-qscintilla --without-qt --without-sndfile --without-sundials-ida --without-sundials_ida --without-sundials_nvecserial --without-umfpack --without-x --without-z,然后就又收获了一堆找不到符号错。

又想到计算模块还是不要去除的好,只去除界面相关的模块。经过反复尝试,我最终的配置是:

 ../configure --disable-docs --disable-java --without-magick --without-portaudio --without-sndfile --without-qt --without-opengl --without-qscintilla --without-framework-opengl --without-framework-carbon ac_cv_search_tputs=-ltermcap --without-fltk --without-fontconfig --disable-openmp --disable-readline --disable-jit --without-freetype --without-glpk --without-openssl

这样编译过后,一共要带上42个DLL,可以保证程序运行。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/467664.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号