3

我有一种情况,我正在使用两个具有重复头文件名的库。例如timer.h存在于两个库中。我认为对此的正常解决方案是明确指定包含中的目录,#include <dir1/timer.h>以便#include <dir2/timer.h>编译器知道我指定的是哪个目录。但是,我的问题是我正在使用的库之一不在我的项目的子目录中。它存在于更高层次的其他地方。那是...

    • 图书馆1
    • 项目
      • 项目文件夹
        • 图书馆2

这样做是为了让多个项目可以引用 Library1。这似乎是一个好主意。但是,既然我有 Library2 的名称冲突,它就会产生问题。另一个重要的细节是我经常使用两个不同的工作站。Library1 在这些工作站上的绝对位置不相同,两者之间的相对位置(相对于项目文件夹)也不相同。到目前为止,我一直在做的是将两个绝对位置添加到预处理器的搜索路径中。

无论如何,我会很感激你可能提供的任何指导。

4

2 回答 2

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".

于 2012-10-31T00:08:11.903 回答
2

我更喜欢在我的项目中包含特定版本的外部库的副本,并根据需要更新到较新的版本(但实际上并不更改项目中的外部库)。如果您只是参考每个人都使用的当前(更改)版本,那么您的项目可能会更改行为,甚至无需更改其代码。您的项目的发布还必须引用您在该时间点使用的任何版本的库才能完成。

如果你这样做,如果你想使用这种方法,相对路径总是相同的(比如“../ExternalLib”)。或者你可以按照戴夫的建议去做。

于 2012-10-31T00:35:39.400 回答