Gcc 选择正确的库版本
我有一个使用libibverbs的项目。我必须在服务器上编译这个项目才能在那里运行。服务器在系统范围内安装了libibverbs,但不幸的是,它不支持我需要的功能 我决定编译并使用我自己的libibverbs版本,它具有相应的特性。因此,我编译了库,将其安装到我的主目录,并更新了以下环境变量:PATH、LD_library_PATH、C_INCLUDE_PATH、library_PATH、CPLUS_INCLUDE_PATH 现在我必须编译我的项目。首先我调用configure,它失败并显示以下错误消息:Gcc 选择正确的库版本,gcc,linker,Gcc,Linker,我有一个使用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
的值
对这次考试没关系
对于GNUmake
,它应该将-L
-选项传递给链接器
通常在环境变量LDFLAGS
中指定。GNUautoconf
-哪个
生成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