0

我正在链接引用共享库的 Linux 可执行文件:

g++ Debug/file.o Debug/MyLib.so -o Debug/MyApp -Wl,--rpath='$ORIGIN'

问题是生成的 MyApp 文件引用了“Debug/MyLib.so”,所以如果我从 Debug 目录运行它,它不会找到它。因此,指定 -Wl,--rpath='$ORIGIN' 没有帮助。

有没有办法告诉 GNU LD 使用“Debug/MyLib.so”文件,但在可执行文件中将其记录为“MyLib.so”?

4

2 回答 2

1

如果不想更改库的名称,可以在创建时 使用soname选项。

例如:

建立图书馆

$> g++ -fpic -c mylib.cpp 
$> g++ -shared -o subdir/mylib.so mylib.o -Wl,-soname=mylib.so

构建程序

g++ -o subdir/main main.cpp -Lsubdir -l:mylib.so -Wl,-rpath='$ORIGIN'

(不要忘记-l选项后的冒号)

于 2013-01-27T21:57:18.603 回答
0

您为共享库链接不当。您应该将该库重命名为 libMyLib.so,并使用以下命令链接您的可执行文件:

g++ Debug/file.o -o Debug/MyApp -Wl,--rpath='$ORIGIN' -LDebug -lMyLib

-LDebug所说的是在链接时在目录中搜索库Debug,然后在指定的路径中-lMyLib查找名为libMyLib.so(或libMyLib.a)的-L库,以及标准库搜索路径。

linux/unix 下库的标准命名约定是libLibraryName,并且链接器知道当您要求使用 链接到库-l时,它应该查找以libthatname 为前缀的文件 当您以之前的形式使用它时,它实际上记录了绝对库这是在链接时使用的,而不是仅记录库名称并依靠运行路径解析库路径的正常机制。

于 2013-01-27T21:18:10.437 回答