使用系统版本或库的本地版本构建

时间:2014-06-10 03:24:53

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

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

  • 使用系统版本的库编译和链接代码,或
  • 使用同一个库的本地版本编译并链接代码

换句话说:

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

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

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

但是当我选择本地版本时,根据编译/链接顺序(至少很难弄清楚),构建可以针对系统或本地库发生,具体取决于编译器首先找到的那个。 / p>

此外,当我运行程序时,如果我想测试本地库版本,我需要将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版运行)

1 个答案:

答案 0 :(得分:1)

我认为这可以这样解决:

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

否则使用默认系统设置。

根据我从GCC的IRC频道学到的知识,-I和-L路径应该优先于系统路径。另外,请检查http://www.scons.org/wiki/UsingOrigin以获取有关对SCons使用rpath(和$ ORIGIN)的说明。