日期:2014-05-16  浏览次数:20788 次

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

# 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