为什么静态编译一个程序的时候总是出错?大侠帮我看看
我先用了如下命令编译一个程序,采用动态连接方式:
# arm-linux-gcc -o VideoPlayer VideoPlayer.c -lavcodec -lavutil -lavformat -lswscale
编译很顺利,然后我想采用静态连接方式编译它:
# arm-linux-gcc -static -o VideoPlayer.cxe VideoPlayer.c -lavcodec -lavutil -lavformat -lswscale
这个时候总是出错,错误是在连接的时候出现的。
我现在的需求是不想要动态连接方式,而是采用静态连接方式把库直接加载到程序里编译成可执行程序,这样在其他平台运行这个程序的时候就不需要加载那么多动态库了,
但是我静态编译总是失败,而动态编译却一点问题都没有,这个为什么啊?
是不是静态编译的时候没有设置好编译选项呢?
先谢谢大家了。
[最优解释]
我已经把.a库放到了工程目录下,并且编译的时候用-L指定了库目录
我参考以前别人的笔记就是说只要加-static编译选项就可以了,但是在我这里就失败了
能不能帮我再分析一下?
谢谢了
[其他解释]
楼主可以
动态链接时LD能动态分析调用依赖关系,调整链接顺序,顺利完成链接。
静态链接时,LD以固定顺序进行链接,命令行的目标文件和库之间需要按调顺序出现(即调用的目标文件或库在前,被调用的库在后),才能链接成功,如果顺序不正确,往往链接失败
http://blog.csdn.net/mymtom/archive/2007/07/01/1674184.aspx
[其他解释]
太感谢大家了
我调整一下库的顺序再进行编译还是出错:
ffmpeg/lib/libswscale.a(swscale.o): In function `initFilter':
ffmpeg/libswscale/swscale.c:1158: undefined reference to `ceil'
ffmpeg/libswscale/swscale.c:1220: undefined reference to `pow'
ffmpeg/libswscale/swscale.c:1235: undefined reference to `pow'
ffmpeg/libswscale/swscale.c:1217: undefined reference to `cos'
ffmpeg/libswscale/swscale.c:1221: undefined reference to `pow'
ffmpeg/libswscale/swscale.c:1244: undefined reference to `sin'
ffmpeg/libswscale/swscale.c:1244: undefined reference to `sin'
ffmpeg/libswscale/swscale.c:1239: undefined reference to `sin'
ffmpeg/lib/libswscale.a(swscale.o): In function `sws_getGaussianVec':
ffmpeg/libswscale/swscale.c:2888: undefined reference to `sqrt'
ffmpeg/libswscale/swscale.c:2901: undefined reference to `exp'
ffmpeg/lib/libavformat.a(utils.o): In function `print_fps':
ffmpeg/libavformat/utils.c:2797: undefined reference to `lrintf'
ffmpeg/lib/libavformat.a(utils.o): In function `av_find_stream_info':
ffmpeg/libavformat/utils.c:2119: undefined reference to `lrintf'
ffmpeg/lib/libavformat.a(avienc.o): In function `avi_write_header':
ffmpeg/libavformat/avienc.c:304: undefined reference to `lrintf'
ffmpeg/lib/libavcodec.a(opt.o): In function `av_set_number2':
ffmpeg/libavcodec/opt.c:68: undefined reference to `llrint'
ffmpeg/libavcodec/opt.c:67: undefined reference to `llrint'
ffmpeg/lib/libavcodec.a(opt.o): In function `av_set_string3':
ffmpeg/libavcodec/opt.c:160: undefined reference to `__isnan'
ffmpeg/lib/libavcodec.a(aac.o): In function `flt16_even':
ffmpeg/libavcodec/aac.c:882: undefined reference to `frexpf'
ffmpeg/libavcodec/aac.c:883: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:883: undefined reference to `rintf'
ffmpeg/libavcodec/aac.c:883: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:882: undefined reference to `frexpf'
ffmpeg/libavcodec/aac.c:883: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:883: undefined reference to `rintf'
ffmpeg/libavcodec/aac.c:883: undefined reference to `ldexpf'
ffmpeg/lib/libavcodec.a(aac.o): In function `flt16_round':
ffmpeg/libavcodec/aac.c:875: undefined reference to `frexpf'
ffmpeg/libavcodec/aac.c:876: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:876: undefined reference to `roundf'
ffmpeg/libavcodec/aac.c:876: undefined reference to `ldexpf'
ffmpeg/lib/libavcodec.a(aac.o): In function `flt16_trunc':
ffmpeg/libavcodec/aac.c:889: undefined reference to `frexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `truncf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:889: undefined reference to `frexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `truncf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:889: undefined reference to `frexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `truncf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `truncf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:889: undefined reference to `frexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `truncf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:889: undefined reference to `frexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `truncf'
ffmpeg/libavcodec/aac.c:890: undefined reference to `ldexpf'
ffmpeg/lib/libavcodec.a(aac.o): In function `decode_spectrum_and_dequant':
ffmpeg/libavcodec/aac.c:820: undefined reference to `cbrtf'
ffmpeg/libavcodec/aac.c:782: undefined reference to `sqrtf'
ffmpeg/libavcodec/aac.c:864: undefined reference to `sqrtf'
ffmpeg/libavcodec/aac.c:864: undefined reference to `sqrtf'
ffmpeg/libavcodec/aac.c:866: undefined reference to `cbrtf'
ffmpeg/lib/libavcodec.a(aac.o): In function `decode_cce':
ffmpeg/libavcodec/aac.c:1151: undefined reference to `pow'
ffmpeg/libavcodec/aac.c:1151: undefined reference to `pow'
ffmpeg/libavcodec/aac.c:1181: undefined reference to `pow'
ffmpeg/libavcodec/aac.c:1164: undefined reference to `pow'
ffmpeg/lib/libavcodec.a(aac.o): In function `aac_decode_init':
ffmpeg/libavcodec/aac.c:440: undefined reference to `pow'
还有好多错误,就没有全部列出来了
大侠再帮我看看
谢谢了
[其他解释]
我遇到的问题是这样子的:
开始使用如下命令编译,出现很多错误
arm-none-linux-gnueabi-gcc -lm -Wall -static -lpthread *.c -o hello
错误如下:
tools.c:(.text+0x33e4): undefined reference to `sqrt'
...(省略)
然后使用调整顺序后的命令,编译通过:
arm-none-linux-gnueabi-gcc -Wall -static *.c -o hello -lpthread -lm
希望这对大家有些帮助!
[其他解释]
很重要的一点,记得先 -o 再 -l
[其他解释]