首页 > 解决方案 > 使用动态库编译二进制文件

问题描述

我有 20 个共享对象文件,我想使用“a.so”中的一个函数,但我的问题是 a.so 链接到其他库。当我编译我的 main 时,我收到以下错误:

/usr/bin/ld: warning: b.so, needed by /home/test/lib/a.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: c.so, needed by /home/test/lib/a.so, not found (try using -rpath or -rpath-link)

如何编译我的 main 以便能够在 a.so 中使用该函数?我曾尝试使用此方法:gcc -L. -WL, -rpath,. main.c -l{libraryName} -o main 但出现以下错误:

gcc: error: unrecognized command line option ‘-WL,’; did you mean ‘-Wa,’?
gcc: error: unrecognized command line option ‘-rpath,.’

标签: linuxgccdynamic-linking

解决方案


当我编译我的 main 时,我收到以下错误:

上面的说法有两个错误:

  • 你得到一个警告,而不是一个错误,并且
  • 当你链接你的程序时得到它,而不是在你编译它时。

如何编译我的 main 以便能够在 a.so 中使用该函数?

像这样:

gcc -L. -Wl,-rpath=. main.c -l{libraryName} -o main

PS 一般来说,-rpath使用相对路径是一种不好的做法,因为如果您从不同的目录调用它,程序将无法运行。更好的解决方案是使用 absolute-rpath代替:

gcc -L/home/test/lib -Wl,-rpath=/home/test/lib main.c -l{libraryName} -o main

推荐阅读