首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

为什么静态编译一个程序的时候总是出错?大侠帮小弟我看看

2012-12-14 
为什么静态编译一个程序的时候总是出错?大侠帮我看看我先用了如下命令编译一个程序,采用动态连接方式:# ar

为什么静态编译一个程序的时候总是出错?大侠帮我看看
我先用了如下命令编译一个程序,采用动态连接方式:

# arm-linux-gcc -o VideoPlayer VideoPlayer.c -lavcodec -lavutil -lavformat -lswscale

编译很顺利,然后我想采用静态连接方式编译它:

# arm-linux-gcc -static -o VideoPlayer.cxe VideoPlayer.c -lavcodec -lavutil -lavformat -lswscale

这个时候总是出错,错误是在连接的时候出现的。

我现在的需求是不想要动态连接方式,而是采用静态连接方式把库直接加载到程序里编译成可执行程序,这样在其他平台运行这个程序的时候就不需要加载那么多动态库了,

但是我静态编译总是失败,而动态编译却一点问题都没有,这个为什么啊? 

是不是静态编译的时候没有设置好编译选项呢?

先谢谢大家了。

[最优解释]

引用:
不报错才怪呢...

gcc的-l参数是啥含义?

你要是想编译成静态的,需要去找到.a版本的库,名字大概是libavcodec.a,后面的依次类推

是吗?
$ gcc pthread.c -lpthread
$ ls -lh a.out 
-rwxrwxr-x 1 x x 4.9K 05-13 17:42 a.out
$ file a.out 
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

$ gcc -static pthread.c -lpthread
$ ls -lh a.out
-rwxrwxr-x 1 x x 660K 05-13 17:42 a.out
$ file a.out 
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.9, not stripped

LZ你要把报的错贴上来啊,不用让别人猜谜语

[其他解释]
不报错才怪呢...

gcc的-l参数是啥含义?

你要是想编译成静态的,需要去找到.a版本的库,名字大概是libavcodec.a,后面的依次类推
[其他解释]
如果你想做静态的编译,最好的方法是使用.a的那个静态库,然后这样编译:

gcc -o test test.c libtest.a

如果用-static,因为你的是交叉编译环境,所以对应的.so库要是for ARM的,而不是for PC的。这里假定你的板

子是ARM的处理器,因为这个应用的更广一些。

那你需要把那些.so拷贝到你的交叉编译环境的lib路径下去,而不是PC的lib路径下。如果你自己显示的指定了库

的位置,依然还是编译出错,那最好把出错信息贴上来
[其他解释]
引用:
楼主可以
动态链接时LD能动态分析调用依赖关系,调整链接顺序,顺利完成链接。
静态链接时,LD以固定顺序进行链接,命令行的目标文件和库之间需要按调顺序出现(即调用的目标文件或库在前,被调用的库在后),才能链接成功,如果顺序不正确,往往链接失败
http://blog.csdn.net/mymtom/archive/2007/07/01/1674184.aspx

楼主可以“调整一下库的顺序试试”

[其他解释]
数学函数库你没有链接。再加上 -lm 的选项,链接上数学库

然后重新编译一下,有错误再把错误贴上来
[其他解释]
引用:
引用:
不报错才怪呢...

gcc的-l参数是啥含义?

你要是想编译成静态的,需要去找到.a版本的库,名字大概是libavcodec.a,后面的依次类推

是吗?
$ gcc pthread.c -lpthread
$ ls -lh a.out
-rwxrwxr-x 1 x x 4.9K 05-13 17:42 a.out
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped…

呵呵,我大意了,把static给漏掉了。

抱歉!
[其他解释]
不知道楼主问题解决了没有,我也遇到了同样的问题,调了1个多星期了,还是不行,烦死了
[其他解释]
你好,fetag



我已经把.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
[其他解释]

引用:
很重要的一点,记得先 -o 再 -l
多谢!

热点排行