繁体   English   中英

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

[英]What is the meaning of “Warning: Linking the shared library against static library is not portable”?

我正在使用 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

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

编辑 :

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

确保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

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

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

第二个警告来自 gcc。 它告诉你编译时提供静态库是没有意义的。 那是因为您在C FLAGS$(PATH)/libmxml.a ,它与存在无关。 事实上,大多数的时候,你应该有$(PATH)/libmxml.a ,但-L$(PATH) -lmxml代替。 那应该仍然在LD FLAGS ,但是如果这也进入编译器命令行,gcc 不会抱怨。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM