如何在包含路径中存储.c和.h文件,与当前项目的源代码分开

时间:2015-02-22 14:49:55

标签: c++ c ide include-path

我试图缩短我的问题(旧问题仍然可以在下面找到)

我当前的目录结构如下所示

C:\users\documents\projects 
    |
    +----- utility
    |         |
    |         +----- include (files not shown)
    |         +----- src
    |                 |
    |                 +----file1.c (and other files not shown)
    |
    +----- proj1
             |
             +----- include (files not shown)
             +----- src
                     |
                     +----- proj_file1.c (and other files not shown)

如果我将此目录添加为包含路径,我可以将 .. \ utility \ include 的.h文件与#include <file.h>包含在proj1中IDE(在proj1中)。是否有 .. \ utility \ src 文件的等效解决方案?我在Windows 7上使用LPCXpresso IDE。我想在任何IDE上都有相同的解决方案,所以我只想知道这个无论路径(如果没有找到.c文件将在哪里搜索。\ src 目录)通常被调用以在我的项目设置中找到它。

  • 我尽量避免使用库(.lib,.dll)
  • 我不想复制每个项目中的.c文件(proj1,proj2,...,projn)
  • 我希望能够简单地编辑.c和.h文件,如果重新编译proj1等,将会应用更改,因为它们将用于所有其他项目
  • 生成自己的makefile可能是一个解决方案(但是不应该有一个选项来在IDE中添加源文件路径吗?)
  • #include <..\utility\src>是一个不理想的解决方案,因为对目录的更改将在每个单个文件中添加此行,其中更改选项中的路径只需点击几下。

提前致谢并感谢您现在的答案


我的问题的旧版本:

动机:想象一下,你在一些IDE中用C / C ++编写一个程序,像往常一样有.c和.h源代码文件。另外你有一个helper.c和helper.h文件,你定义了一些有用的,而不是项目相关的函数(可以在几个项目中使用)。您希望包含这些文件,但如果存储项目相关的源代码,则不希望这些文件存在。

据我所知 .h文件可以存储在单独的文件夹中, includepath 指向该文件夹。可以在每个IDE中设置此路径。进一步改变了

#include "helper.h"

声明

#include <helper.h>

如果我将.c文件放在同一个文件夹中而不单独包含它们,编译器将找不到它们。如果我也包括它们

#include <helper.c>

多重包含将导致多个函数deklaration,从而导致编译器错误。只有解决方案可能是

#ifndef helper_c_
//content of helper.c file
#endif

,这是不切实际的,并且总是需要包含.h和.c文件。但我只需要存储一次,没有副本,如果我需要更改某些内容,它将在所有项目中更改,因为它们都指向该文件夹

我现在也谈论库文件,你有一个.lib和一个.dll文件,其中.lib文件需要由库路径指向,而.dll文件需要在同一个文件夹中。之后是.exe文件。但这不是我想要的。

我的问题:是否有可能将.h和.c文件(在我目前的情况下有10个文件对)存储在一个单独的文件夹中,并通过包含路径指向它们或者?我试着用谷歌搜索,但我想我不太清楚我会找什么。

感谢您的帮助

编辑:我忘了提及:我使用的是Windows 7,而我目前的IDE是LPCXpresso-IDE

4 个答案:

答案 0 :(得分:2)

好的,假设你有这个目录结构:

C:\users\documents\projects 
        |
        +----- utility
        |         |
        |         +----- include (files not shown)
        |         +----- src
        |                 |
        |                 +----file1.c (and other files not shown)
        |
        +----- proj1
                 |
                 +----- include (files not shown)
                 +----- src
                         |
                         +----- proj_file1.c (and other files not shown)

并且还假设当前编译目录位于proj1/src目录中。我看到你的问题至少有三个解决方案:

  1. 如果您真的想要#include我不建议做的源文件,只需使用文件的相对路径即可。

    #include "..\..\utility\src\file1.c"
    
  2. 现在除了包含源文件的问题之外,这往往非常脆弱,因为如果更改目录结构(或更改目录名称),一切都会中断。您需要返回源代码并修复每行代码。

    1. 正如iharob建议的那样,使用make文件来处理这个问题。在这种情况下,您将拥有一个看起来像这样的编译行(假设您正在使用Microsoft的工具更改);

      cl /I..\..\utility\include ..\..\utility\src\file1.c  /o util_file1.o
      
    2. 这会导致编译结果被删除到当前工作目录中,链接器将能够找到所有目标文件并将它们组合成一个可执行文件。我们仍然在这里处理相对路径,但所有更改都在一个文件中,并且通过使用make变量,更改将在一行或两行。

      1. 如果实用程序目录中的函数将用于多个项目,我个人最喜欢的解决方案是创建一个生成动态库(windows下的dll)的实用程序项目,并将后续项目与该库链接。您仍然需要处理包含文件所在的位置(可能是所有项目文件夹所在位置的顶级目录?),但对我来说,库似乎更清晰。它还有一个额外的好处,如果你想修改实用程序项目中的代码,只需重新编译库,你的其余项目将会看到&#39;修改而不重新编译它们(假设你没有修改库的接口)。
      2. 希望这有帮助, Ť

答案 1 :(得分:0)

当然是的,根据您使用的编译器,会有一个开关告诉编译器在哪里搜索标题,gcc和其他一些AFAIK,它是{{1例如,假设您的标头位于-I目录中,则应该像这样调用编译器

myproject/headers

在不同目录中使用gcc -I myproject/header ${OTHER_OPTIONS} ${SOURCE_OR_OBJECT_FILES} -o ${OUTPUT_FILE} 文件构建项目的常用方法是使用.c和一个可以解析Makefile的程序并调用必要的命令来构建项目

答案 2 :(得分:0)

警告:#include源(.c)文件通常不是一个好主意。源文件用于编译,而不是包含 - 包括它们可能会导致奇怪的错误(最重要的是,明显重新定义函数)。

以下是我要做的事情(对于每个需要帮助代码的项目):

  • 将您的实用程序.c文件添加到项目中。查找添加现有文件... 或类似的IDE功能;这可确保您的实用程序源文件(即helper.c)与项目一起编译。
  • 对于.h文件,请将其包含在#include <helper.h>中,以便您使用实用程序声明。
  • 最后,找到名为 Include paths ,a.k.a。 -I 的编译器选项,并将其设置为包含helper.h的文件夹。这通常可以在项目选项/设置中找到。

答案 3 :(得分:-1)

在浏览了所有设置和选项后,我找到了以下令人满意的解决方案:创建到源文件夹的链接

此答案适用于LPCXpresso IDE

  • 想象我的问题中显示的文件夹结构
  • 在LPCXpresso IDE中 - &gt;右键点击项目 - &gt;特性
  • 导航至C / C ++ General&gt;路径和符号&gt; Source Loacation
  • 点击&#34;链接文件夹...&#34;
  • 在打开的对话框中标记复选框链接到文件系统中的文件夹
  • 点击浏览...或输入 C:\ users \ documents \ projects \ utility \ src
  • 点击确定
  • 点击“应用”
  • 重新编译并开心:)