“警告:将共享库与静态库链接不可移植”是什么意思?

时间:2011-12-02 06:36:22

标签: c linux warnings shared-libraries static-libraries

我使用libmxml.a库的一些函数制作一个动态库,但是我收到了这个警告:

*Warning: Linking the shared library libgstmatroskademux.la against the _
*static library /home/Mr32/gst-template4_final/gst-plugin/src/libmxml.a _
is not portable!

我也收到了这个警告:

gcc: /home/Mr32/gst-template4_final/gst-plugin/src/libmxml.a: linker _
input file unused because linking not done

那么这个警告的含义是什么,我该如何解决呢?

修改:

有一个已经自动生成的make文件用于编译gstreamer插件。现在在该插件中使用libmxml.a的一些功能,我在make文件的$(PATH)/libmxml.a变量中添加了GST_CFLAGS。现在,当我执行makemake install时,插件工作正常,但我仍然收到此警告。

4 个答案:

答案 0 :(得分:8)

确保libmxml.a中的对象文件是使用-fPIC构建的。有必要构建一个共享库。另请参阅http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

这是一个简单的例子

$ cat stat.c 
int five() { return 5; }
$ gcc -c stat.c -fPIC
$ ar crus libstat.a stat.o
$ cat dynamic.c
int ten() { return five() + five(); }
$ gcc -c dynamic.c -fPIC
$ gcc -shared -o libdyn.so dynamic.o -L. -lstat
$ ldd libdyn.so # Just to show static linkage to libstat.a
  linux-vdso.so.1 =>  (0x00007fffca1b8000)
  libc.so.6 => /lib/libc.so.6 (0x00007fc004649000)
  /lib/ld-linux-x86-64.so.2 (0x00007fc004bf7000)
$ cat main.c 
int main() { return ten(); }
$ gcc main.c -L. -ldyn
$ LD_LIBRARY_PATH=. ./a.out 
$ echo $?
10

答案 1 :(得分:6)

将共享库链接到静态库是不可能的(除非您真的非常清楚自己在做什么)。不要这样做。

第一个警告来自libtool。它告诉你,你要求的操作将在不同的系统上做不同的事情,其中​​一些可能不是你想要的。通常它会以各种壮观的方式失败,因为共享和静态库中的代码需要使用不同的编译器标志进行编译。

第二个警告来自gcc。它告诉你,编译时提供静态库是没有意义的。那是因为你在$(PATH)/libmxml.a中有CFLAGS,在那里没有生意。事实上,大部分时间你应该拥有$(PATH)/libmxml.a,而是-L$(PATH) -lmxml。这应该仍然在LDFLAGS,但是如果这也使它成为编译器命令行,gcc也不会抱怨。

答案 2 :(得分:4)

  

将共享库libgstmatroskademux.la链接到静态库

这是警告你,如果你,例如试图在64位Linux上构建它,它可能会失败。这是因为在x86_64上,链接到共享库的所有代码必须使用-fPIC标志进行编译,而.a库中的代码通常不是。

  

gcc:... / libmxml.a:链接器输入文件未使用,因为链接未完成

这警告您有一个伪命令行。很可能你正在编译某些东西,并在命令行上有-c(它告诉GCC在编译源代码后停止,执行链接)。由于您也在同一命令行上提供libmxml.a,GCC意识到您不知道自己在做什么,并警告您(更多)考虑它。

答案 3 :(得分:0)

实际上所有以前的答案在第一个警告的解释上都是错误的(尤其是被接受的警告)。静态库不可移植的警告很可能源于您对其路径进行了硬编码(这与生成的 libgstmatroskademux.la 文件实际上将包含此路径的事实有关)。因此,与其依赖 pkg-configgcc 本身为您搜索静态库(这将确保您的项目在多个平台和发行版上成功编译),您还使用了静态库的固定路径库(并且上述路径在其他平台上很可能会有所不同)。修复确实是将 -L$(PATH) -lmxml 传递给 gcc(如已接受答案的第二部分所建议的那样),因为这将确保更大的兼容性并使 Linking the shared library ... against the static library ... is not portable! 错误也消失。

相关问题