【问题标题】:Including Files - Shared Source And Duplicate Names包括文件 - 共享源和重复名称
【发布时间】:2012-10-30 23:59:33
【问题描述】:
我有一种情况,我正在使用两个具有重复头文件名的库。例如timer.h 存在于两个库中。我认为对此的正常解决方案是明确指定包含中的目录,例如#include <dir1/timer.h> 或#include <dir2/timer.h>,以便编译器知道我指定的是哪个目录。但是,我的问题是我正在使用的库之一不在我的项目的子目录中。它存在于更高层次的其他地方。那就是……
这样做是为了让多个项目可以引用 Library1。这似乎是一个好主意。但是,既然我有 Library2 的名称冲突,它就会产生问题。另一个重要的细节是我经常使用两个不同的工作站。 Library1 在这些工作站上的绝对位置不相同,两者之间的相对位置(相对于项目文件夹)也不相同。到目前为止,我一直在做的是将两个绝对位置添加到预处理器的搜索路径中。
无论如何,如果您能提供任何指导,我将不胜感激。
【问题讨论】:
标签:
include
c-preprocessor
【解决方案1】:
您与"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"。
【解决方案2】:
我希望在我的项目中包含特定版本的外部库的副本,并根据需要更新到较新的版本(但实际上不会更改项目中的外部库)。如果您只是参考每个人都使用的当前(更改)版本,那么您的项目可能会更改行为,甚至无需更改其代码。您的项目的发布还必须引用您当时使用的任何版本的库才能完成。
如果您这样做,如果您想使用该方法,相对路径总是相同的(例如“../ExternalLib”)。或者你可以按照戴夫的建议去做。