选择正确的库版本

时间:2016-07-02 16:05:10

标签: 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会成功编译。

要明确以下失败:https://gist.github.com/planetA/a421669269b14e69026c53f56fa45b2b

以下作品: https://gist.github.com/planetA/3b0e22bf6aca3a1c67f30bfa3666d9a8

您是否可以帮助我以配置捕获它的方式强制选择新版本的库?

1 个答案:

答案 0 :(得分:1)

LD_LIBRARY_PATH指定要搜索的目录 默认值,用于要在运行时的进程中加载​​的库。 它不会影响搜索库的目录 为了在构建时链接它。

链接器在指定的目录中搜索库 在其搜索之前,在其命令行中使用-L dir 选项 默认目录。您的configure脚本测试是否可以在链接器的搜索目录中找到定义该函数的libibverbsibv_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将恢复为默认行为。