我创建了一个我希望其他人使用的库。
编译我的库:
/usr/bin/g++ -fPIC -shared -Wl,-soname,libMYLIB.so [inputs] -lboost_system -lboost_thread
编译二进制文件:
/usr/bin/g++ myTest.cpp -lMYLIB -lboost_system
我希望这一行只有:
/usr/bin/g++ myTest.cpp -lMYLIB
如何避免以后必须指定我的库依赖项?我在寻找链接器或编译器中的哪个标志?
答案 0 :(得分:1)
有一个链接器选项(我的意思是output
链接器http://linux.die.net/man/1/ld) - unresolved-symbols = ignore-all或-unresolved-symbols = ignore-in-object-files:
ld
创建动态二进制文件时,已知所有共享文件 它应该引用的库包含在链接器中 命令行。
这就是一个例子。我有一个库Determine how to handle unresolved symbols. There are four possible values for method:
* ignore-all
Do not report any unresolved symbols.
* report-all
Report all unresolved symbols. This is the default.
* ignore-in-object-files
Report unresolved symbols that are contained in shared libraries, but ignore them if they come from regular object files.
* ignore-in-shared-libs
Report unresolved symbols that come from regular object files, but ignore them if they come from shared libraries. This can be useful
和一个应用libmylib.so
:
首先我构建了库:
main
当我构建应用程序但我没有在命令行上添加-lmylib时。通常它会导致错误$ g++ -fpic -shared mylib.cpp -o libmylib.so
,但由于我在命令行中添加了Unresolved external symbols
,因此我没有错误:
-Wl,--unresolved-symbols=ignore-in-object-files
然后我运行我的程序:
$ g++ -fpic -g main.cpp -Wl,--unresolved-symbols=ignore-in-object-files -Wl,-rpath,.
它没有按预期工作,但后来我使用了LD_PRELOAD:
$ ./a.out
./a.out: symbol lookup error: ./a.out: undefined symbol: _Z7my_funcd
因此,使用LD_PRELOAD可以正常工作