如何指定库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.alibfoo.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_PATHCPLUS_INCLUDE_PATH ,它们分别指示在哪里查找库以及在哪里查找头文件( CPATH也可以完成这项工作),而不指定-L和-I选项。

编辑: CPATH包含-I标题和CPLUS_INCLUDE_PATH-isystem

如果在Windows中使用DLL,并想在Linux / QT中跳过.so版本号,那么添加“CONFIG + = plugin”将会取出版本号。 为了使用.so的绝对path,正如Klatchko先生所说的那样,将它交给链接器工作正常。