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

Jee*_*tel 10 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!
Run Code Online (Sandbox Code Playgroud)

我也收到这个警告:

gcc: /home/Mr32/gst-template4_final/gst-plugin/src/libmxml.a: linker _
input file unused because linking not done
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

Jan*_*Jan 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
Run Code Online (Sandbox Code Playgroud)


Jan*_*dec 6

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

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

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

  • 将共享库链接到静态库是完全可能的,并且在UNIX上通常是可取的. (3认同)

Emp*_*ian 5

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

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

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

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