在g++中将boost的包含路径指定到一个位置

4

我在处理一个使用boost库的代码库。但是,最近在新用户的电脑上构建基础时遇到了问题。我能够将问题简化为以下内容。构建系统如下:

/root
    /SubModules_with_Makefiles_and_Code
    /thirdparty/boost

子模块代码将像这样引用boost库(例如):
#include <boost/property_tree/ptree.hpp>

而子模块的构建文件将会生成这样一段代码(例如):

g++ -c -o code.o code.cpp -I/root/thirdparty/boost

我们的第三方boost库版本为1.37。然而,一些模块已经开始使用更新的boost版本。这个问题被掩盖了,因为这些模块所在的机器上安装了位于/usr/include/boost的boost 1.41。
这个问题变得明显是因为新用户的机器上没有在/usr/include中安装boost 1.41。理想情况下,我希望g++只在第三方目录中查找boost,而不去其他地方寻找。这样,我们可以更好地控制代码构建的方式。
-I 会将放在系统包含文件之前进行查找,但仍然会查找系统包含文件,这就是后来的boost版本可能会根据机器安装在那里的原因。我可以禁止查找系统包含文件,但那将是一个真正的烦恼。
除了替换,是否有任何聪明的方法来解决这个问题?
#include <boost/something.hpp>

to

#include <thirdparty/boost/something.hpp>

如果有帮助的话,我正在使用Redhat Linux上的GNU make 3.81和g++ 4.4.5。

2个回答

0

查看'include path'命令行选项(-I)。您可以设置它搜索包含文件的位置。文档在这里


谢谢,但我不确定我是否会在这种情况下提供帮助。如果在-I/root/thirdparty中找不到SomeBoost.hpp的较新版本,则仍将在/usr/include中查找SomeBoost.hpp。 - Bitdiot

0

你可能想看一下gcc手册的2.3节:http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

你要找的编译器开关很可能是

-nostdinc

但最好自己看一下。

编辑:哦,我刚才看到你不想禁用默认搜索路径 - 在这种情况下,只需使用 -I 开关:

您可以使用 -Idir 命令行选项将其添加到此列表中。在默认目录之前,按从左到右的顺序搜索所有由 -I 命名的目录。


1
是的,感谢及时回复,但添加-I不会解决问题(我认为)。问题在于开发人员可能已经安装了较新版本的boost在/usr/include中。因此,-I只是将要查找的目录放在标准目录(如/usr/include)之前,但它并不替换/usr/include。因此,如果有人在他们的代码中添加#include <boost/SomeLaterVersion.hpp>,即使添加了-I/root/thirdparty,仍然可以选择较新的版本,因为SomeLaterVersion.hpp可能隐藏在/root/thirdparty之后被查看。 - Bitdiot
在-I显式指定的目录之后搜索/usr/local/include不应该是个问题,因为第一个匹配项会被使用。你可能需要使用cpp的“-v”选项来检查顺序。它应该列出搜索目录的顺序。 - mikyra
1
你确定吗?我在我的机器上没有看到那种行为。如果g++在/root/thirdparty/boost-1.37中找到一个头文件,它将首先使用它。但是,如果一个头文件不在boost-1.37中,而是在一个较新的boost版本中,它将查找/usr/include。例如,boost/heap/binomial_heap.hpp在boost 1.49中,因此它将在/root/thirdparty/boost-1.37之外寻找该文件。 - Bitdiot
肯定会一直搜索,直到找到第一个匹配项。由于/usr/include是最后一个被搜索的目录,我并没有看到实际的问题。如果到目前为止还没有找到,那么要么在-I开关中没有给出所需头文件的正确路径,要么它们根本不存在于系统上,因此不会有任何(正确)编译的机会。为了防止第二种情况,您可能只需将BOOST_VERSION与您正在使用的版本进行比较,并在版本不匹配时抛出#error。 - mikyra
我猜问题在于如果g++查找第三方目录之外的内容,那么就会对正在构建的内容产生较少的控制。如果所有开发人员在其计算机上安装了不同版本的boost,则可能意味着在构建甚至运行时出现不同的行为。我希望通过限制g++仅查找第三方目录而不是目录之外的boost库来尽可能地减少这种情况。我们已经多次遇到使用boost线程时出现的这个问题。无论如何,我想我需要更加深入地思考真正需要完成的任务。谢谢! - Bitdiot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接