如何指定库path的偏好?
我正在编译一个使用g++
和ld
的c ++程序。 我有一个.so
库,我想在链接过程中使用。 然而,在/usr/local/lib
存在一个相同名称的/usr/local/lib
,而ld
则是通过我直接指定的库来select该库。 我该如何解决这个问题?
对于下面的例子,我的库文件是/my/dir/libfoo.so.0
。 我试过的东西不起作用:
- 我的g ++命令是
g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp
- 将
/my/dir
添加到我的$PATH
en`variables的开始或结尾处 - 添加
/my/dir/libfoo.so.0
作为g ++的参数
将新库的path添加到LD_LIBRARY_PATH
(它在Mac上的名称略有不同…)
你的解决scheme应该使用-L/my/dir -lfoo
选项,在运行时使用LD_LIBRARY_PATH指向你的库的位置。
要么
使用rpath选项通过gcc链接器 – 运行时库searchpath,将被用来代替在标准目录(gcc选项)中查找:
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
这对于临时解决scheme是很好的。 在查看标准目录之前,链接器首先searchLD_LIBRARY_PATH库。
如果你不想永久更新LD_LIBRARY_PATH,你可以在命令行上执行:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
你可以检查链接器知道什么库使用(例子):
/sbin/ldconfig -p | grep libpthread libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
您可以检查您的应用程序正在使用哪个库:
ldd foo linux-gate.so.1 => (0xffffe000) libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000) libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000) librt.so.1 => /lib/librt.so.1 (0xb7e65000) libm.so.6 => /lib/libm.so.6 (0xb7d5b000) libc.so.6 => /lib/libc.so.6 (0xb7c2e000) /lib/ld-linux.so.2 (0xb7fc7000) libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000) libz.so.1 => /lib/libz.so.1 (0xb7c18000)
指定库的绝对path应该可以正常工作:
g++ /my/dir/libfoo.so.0 ...
您是否记得在添加绝对path后删除-lfoo
?
这是一个古老的问题,但似乎没有人提到这一点。
你幸运的是,这件事连接在一起。
你需要改变
g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp
对此:
g++ -g -Wall -o my_binary -L/my/dir bar.cpp -lfoo
您的链接器跟踪它需要解决的符号。 如果它首先读取库,它没有任何需要的符号,所以它忽略了其中的符号。 在需要链接到它们的东西之后指定库,以便链接器具有在其中find的符号。
此外, -lfoo
使它专门search名为libfoo.a
或libfoo.so
的文件。 不是libfoo.so.0
。 因此,无论是在名称或重新命名图书馆appopriate。
引用gcc手册页:
-l library ... It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.
直接将文件添加到g++
的命令行应该已经工作了,除非你把它放在bar.cpp
之前,导致链接器忽略它,因为没有任何符号需要。
或者,可以使用环境variablesLIBRARY_PATH
和CPLUS_INCLUDE_PATH
,它们分别指示在哪里查找库以及在哪里查找头文件( CPATH
也可以完成这项工作),而不指定-L和-I选项。
编辑: CPATH
包含-I
标题和CPLUS_INCLUDE_PATH
的-isystem
。
如果在Windows中使用DLL,并想在Linux / QT中跳过.so版本号,那么添加“CONFIG + = plugin”将会取出版本号。 为了使用.so的绝对path,正如Klatchko先生所说的那样,将它交给链接器工作正常。