为什么静态编译一个程序的时候总是出错?大侠帮我看看
我先用了如下命令编译一个程序,采用动态连接方式:
# 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 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路径下。如果你自己显示的指定了库
的位置,依然还是编译出错,那最好把出错信息贴上来
------其他解决方案--------------------
楼主可以“调整一下库的顺序试试”
------其他解决方案--------------------数学函数库你没有链接。再加上 -lm 的选项,链接上数学库
然后重新编译一下,有错误再把错误贴上来
------其他解决方案--------------------
呵呵,我大意了,把static给漏掉了。
抱歉!
------其他解决方案--------------------不知道楼主问题解决了没有,我也遇到了同样的问题,调了1个多星期了,还是不行,烦死了
------其他解决方案--------------------你好,fetag