Gcc 选择正确的库版本

Gcc 选择正确的库版本,gcc,linker,Gcc,Linker,我有一个使用libibverbs的项目。我必须在服务器上编译这个项目才能在那里运行。服务器在系统范围内安装了libibverbs,但不幸的是,它不支持我需要的功能 我决定编译并使用我自己的libibverbs版本,它具有相应的特性。因此,我编译了库,将其安装到我的主目录,并更新了以下环境变量:PATH、LD_library_PATH、C_INCLUDE_PATH、library_PATH、CPLUS_INCLUDE_PATH 现在我必须编译我的项目。首先我调用configure,它失败并显示以下

我有一个使用libibverbs的项目。我必须在服务器上编译这个项目才能在那里运行。服务器在系统范围内安装了libibverbs,但不幸的是,它不支持我需要的功能

我决定编译并使用我自己的libibverbs版本,它具有相应的特性。因此,我编译了库,将其安装到我的主目录,并更新了以下环境变量:PATH、LD_library_PATH、C_INCLUDE_PATH、library_PATH、CPLUS_INCLUDE_PATH

现在我必须编译我的项目。首先我调用configure,它失败并显示以下错误消息:

conftest.c:(.text.startup+0x7): undefined reference to `ibv_open_xrc_domain'
这是符号,该符号在系统范围的版本中缺失,但在我安装的版本中存在。LIBRARY_PATH中的第一个条目是指向新libibversion的路径,因此我希望它将首先被使用,但似乎还是使用了旧版本

./configure使用的编译命令包含标志-L/libibverbs/1.1.4/lib,该标志指向具有新库版本的目录。这个标志紧跟在-L/usr/lib/./lib64之后,它指向目录,并带有系统范围的libibverbs

如果我在命令末尾添加了-L和新版本,conftest将成功编译

需要明确的是,以下失败:

以及以下工作:


您能否帮助我以配置捕获的方式强制拾取库的新版本?

LD\u library\u PATH
指定要搜索的目录,然后 默认值,用于在运行时加载到进程中的库。 它不会影响在库中搜索的目录 以便在构建时链接它

链接器在指定的目录中搜索库 在其命令行中使用
-L
dir选项,然后再搜索 默认目录。您的
configure
脚本测试它是否可以在链接器的搜索目录中找到定义函数的
libibverbs
ibv\u open\u xrc\u domain
,由于无法打开而失败。
LD\u LIBRARY\u PATH
的值 对这次考试没关系

对于GNU
make
,它应该将
-L
-选项传递给链接器 通常在环境变量
LDFLAGS
中指定。GNU
autoconf
-哪个 生成
configure
脚本-遵循此约定<代码>自动更改生成 项目的
configure.ac
文件中的
configure
脚本

因此,如果您希望修改后的包生成 脚本,这样运行
/configure
将依次生成生成文件 其中
-L
/my/library/version/is/here被传递给链接器,然后 您需要修改项目的
configure.ac
如下:

LDFLAGS="$LDFLAGS -L/my/library/version/is/here"
您需要在
configure.ac
中执行此操作,然后它才能运行的测试
libibverbs
库。进行此更改后,您需要重新配置 通过在项目目录中运行
autoreconf
来重新生成包
配置
脚本

如果您不想像这样更改
configure.ac
,那么您也可以实现同样的效果 生效日期:

./configure LDFLAGS="$LDFLAGS -L/my/library/version/is/here"
或:

然后,直到下一次运行
配置
脚本时,再运行项目的makefile
将
-L/my/library/version/is/here
传递给链接器。但是下一次 运行
/configure
时,必须记住以相同的方式设置
LDFLAGS
,或者
重新生成的makefiles将恢复为默认行为。

您必须更改生成
/configure
脚本的项目的
configure.ac
,如果您希望获得关于如何执行此操作的可靠建议,则必须发布该脚本。但为什么不从库路径捕获新库?这是某种特定的行为吗?还是我做了一些完全奇怪的事情?在第一个要点中没有-L/家/任何东西。您希望它如何工作?此目录位于库路径中。两种方法都有。/configure LDFLAGS=。。。以及在调用autoconf work之前设置LDFLAGS。非常感谢。
export LDFLAGS="$LDFLAGS -L/my/library/version/is/here"
... # in same shell or a subshell
./configure