【问题标题】:Building with either the system version or a local version of a library使用系统版本或本地版本的库构建
【发布时间】:2014-07-30 16:56:07
【问题描述】:

我需要一个可以这样抽象描述的构建机制:

  • 编译代码并将其与库的系统版本链接,或者
  • 编译代码并将其与同一库的本地版本链接

换句话说:

我在我的程序中使用了一个库,我需要测试该库的多个版本。我需要测试安装在系统目录中的系统版本,还需要测试我自己下载、构建和安装在本地目录中的同一库的旧版本或新版本。

我当前的方法:根据用户命令,我要么将 -I 和 -L 留空,要么将它们设置为指向所选版本库的本地目录。

当我使用系统版本时,它工作正常,因为编译器的默认 -I 和 -L 搜索路径指向库的系统版本。

但是当我选择本地版本时,根据编译/链接顺序(至少很难弄清楚),构建可能会针对系​​统或本地库进行,具体取决于编译器首先找到哪个。

另外,当我运行程序时,如果我想测试本地库版本,我需要将 LD_LIBRARY_PATH 设置为本地库目录。

是否有一种干净的方式来构建然后使用库的系统或本地版本运行?

为了避免这种非确定性行为,我可以直接链接 .a 文件(避免 -L 搜索路径),但我仍然会遇到包含路径的问题,因为编译可以使用系统版本标头或一个本地人默默地。

如果有帮助,我正在使用带有 g++ 的 scons。

还有其他方法吗?

基本上我需要做的:

scons
./a.out

(使用库的系统版本运行)

scons library=1.0
./a.out

(与库的 1.0 版一起运行)

scons library=3.0
./a.out

(与库的 3.0 版一起运行)

【问题讨论】:

    标签: build linker g++ libraries include-path


    【解决方案1】:

    我觉得可以这样解决:

    如果针对本地库版本进行编译,请使用 -I<include path>-L<library path>-Wl,-rpath=<library path>

    否则使用默认系统设置。

    根据我从 GCC 的 IRC 频道中了解到的信息,-I 和 -L 路径应该比系统路径更流行。另外,请查看http://www.scons.org/wiki/UsingOrigin,了解有关将 rpath(和 $ORIGIN)与 SCons 一起使用的说明。

    【讨论】: