【问题标题】:Including Files - Shared Source And Duplicate Names包括文件 - 共享源和重复名称
【发布时间】:2012-10-30 23:59:33
【问题描述】:

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

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

这样做是为了让多个项目可以引用 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”)。或者你可以按照戴夫的建议去做。

      【讨论】:

        猜你喜欢
        • 2022-06-15
        • 2011-06-15
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多