我有一个使用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会成功编译。
要明确以下失败:https://gist.github.com/planetA/a421669269b14e69026c53f56fa45b2b
以下作品: https://gist.github.com/planetA/3b0e22bf6aca3a1c67f30bfa3666d9a8
您是否可以帮助我以配置捕获它的方式强制选择新版本的库?
答案 0 :(得分:1)
LD_LIBRARY_PATH
指定要搜索的目录
默认值,用于要在运行时的进程中加载的库。
它不会影响搜索库的目录
为了在构建时链接它。
链接器在指定的目录中搜索库
在其搜索之前,在其命令行中使用-L
dir 选项
默认目录。您的configure
脚本测试是否可以在链接器的搜索目录中找到定义该函数的libibverbs
库
ibv_open_xrc_domain
,但失败是因为它不能。 LD_LIBRARY_PATH
的值
对这个测试无关紧要。
对于GNU make
,它应该传递给链接器的-L
- 选项
通常在环境变量LDFLAGS
中指定。 GNU autoconf
- 哪个
生成您的configure
脚本 - 遵循此约定。 autoconf
生成
项目的configure
文件中的configure.ac
脚本。
因此,如果您希望修改后的包生成一个configure
生成
脚本,以便运行./configure
将反过来生成makefile
其中-L
/ my / library / version / is / here 传递给链接器然后
您需要修改项目的configure.ac
,如:
LDFLAGS="$LDFLAGS -L/my/library/version/is/here"
并且在运行测试之前需要在configure.ac
中执行此操作
libibverbs
库。{进行此更改后,您需要重新配置
通过在项目目录中运行autoreconf
来重新生成包
configure
脚本。
如果您不想像这样更改configure.ac
,那么您可以实现相同的目标
效果:
./configure LDFLAGS="$LDFLAGS -L/my/library/version/is/here"
或:
export LDFLAGS="$LDFLAGS -L/my/library/version/is/here"
... # in same shell or a subshell
./configure
然后直到下次你运行configure
脚本项目的makefile
将-L/my/library/version/is/here
传递给链接器。但是下一次
你运行./configure
,你必须记得以同样的方式设置LDFLAGS
,或者
重新生成的makefile将恢复为默认行为。