我遇到的情况是我使用两个具有重复头文件名的库。例如,两个库中都存在timer.h
。我认为通常的解决方案是明确指定include中的目录,如#include <dir1/timer.h>
或#include <dir2/timer.h>
,以便编译器知道我指定的内容。但是,我的问题是我使用的其中一个库不在我的项目的子目录中。它存在于更高级别的其他地方。那是......
这样做是为了让多个项目可以引用Library1。这似乎是一个好主意。但是,现在我有了Library2的名称冲突,它会产生问题。另一个重要细节是我经常使用两个不同的工作站。 Library1在这些工作站上的绝对位置不同,两者之间的相对位置(相对于项目文件夹)也不相同。我在这一点上所做的是将两个绝对位置添加到预处理器的搜索路径中。
无论如何,我很感激您提供的任何指导。
答案 0 :(得分:3)
您与"dir1/timer.h"
和"dir2/timer.h"
走在正确的轨道上。但不要将其视为dir
将其视为"project1/timer.h"
。现在,在您的makefile中,如果project1
搜索路径不在公共位置,则需要将include
的位置添加到其中。
您的代码中不应包含相对路径(无../file.h
)。它们应该相对于项目的基本目录(例如#include <sys/socket.h>
或#include <linux/sched.h>
)。然后由你的makefile来找到它们(这两个例子都在标准搜索路径中,所以它们可以工作)。对于您的情况,您可以-I<path to project directory>
然后#include "other_project/library.h"
。
答案 1 :(得分:2)
我更喜欢在项目中包含特定版本的外部库的副本,并根据需要更新到更新版本(但实际上并未从项目中更改外部库)。如果您只是参考每个人都使用的当前(更改)版本,那么您的项目可能会改变行为,甚至不会更改其代码。您的项目版本还必须引用您在该时间点使用的库的任何版本才能完成。
如果你这样做的话,如果你想使用那种方法,相对路径总是相同的(例如,&#34; ../ ExternalLib&#34;)。或者你可以像戴夫所说的那样做。