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

How to store .c and .h files in an includepath, separate from source code of current project

本文关键字:项目 源代码 路径 文件 包含 存储      更新时间:2023-10-16

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

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

C:usersdocumentsprojects 
    |
    +----- 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)

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

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

提前感谢,感谢到目前为止的答案


我问题的旧版本:

动机:想象一下,你在某个IDE中用C/C++编写一个程序,并像往常一样拥有.c和.h源代码文件。此外,您还有一个helper.c和helper.h文件,您是否定义了一些有用的,而不是与项目相关的函数(可以在多个项目中使用(。您希望包含这些文件,但不希望在存储与项目相关的源代码时拥有它们。

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

#include "helper.h"

声明到

#include <helper.h>

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

#include <helper.c>

多重包含将导致多函数解构,从而导致编译器错误。唯一的解决方案可能是

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

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

我现在还介绍了库文件,其中有一个 .lib 和一个.dll文件,其中 .lib 文件需要由库路径指向,.dll文件需要与之后的.exe文件位于同一文件夹中。但这不是我想要的。

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

感谢您的帮助

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

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

C:usersdocumentsprojects 
        |
        +----- 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 "....utilitysrcfile1.c"
    

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

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

    cl /I....utilityinclude ....utilitysrcfile1.c  /o util_file1.o
    

这会导致编译结果删除在当前工作目录中,链接器将能够找到所有目标文件并将它们合并到一个可执行文件中。 我们仍然在这里处理相对路径,但所有更改都将在一个文件中,并且通过使用 make 变量,更改将在一两行上。

  1. 如果实用程序目录中的函数将在多个项目中使用,我个人最喜欢的解决方案是创建一个实用程序项目,生成一个动态库(Windows下的dll(,并将后续项目与该库链接。 您仍然需要处理查找包含文件的位置(可能是所有项目文件夹所在的顶层目录?(,但对我来说,库似乎更干净。 它还具有额外的优点,如果您想修改实用程序项目中的代码,只需重新编译库,项目的其余部分将"看到"修改而无需重新编译它们(假设您不修改库的接口(。

希望这有帮助,T

是的,当然有,根据您使用的编译器,将有一个开关来告诉编译器在哪里搜索标头,对于gcc和其他一些 AFAIK,它是-I,所以例如假设您的标头在myproject/headers目录中,编译器应该像这样调用

gcc -I myproject/header ${OTHER_OPTIONS} ${SOURCE_OR_OBJECT_FILES} -o ${OUTPUT_FILE}
使用

不同目录中的.c文件构建项目的常用方法是使用可以解析Makefile并调用必要命令来构建项目的Makefile和程序。

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

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

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

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

此答案适用于 LPCXpresso IDE

  • 想象一下我的问题中显示的文件夹结构
  • 在 LPCXpresso IDE 中 ->右键单击项目 -> 属性
  • 导航到 C/C++ 常规>路径和符号>源定位
  • 单击"链接文件夹...">
  • 在打开的对话框中标记复选框链接到文件系统中的文件夹
  • 单击浏览...或输入 C:\用户\文档\项目\实用程序\src
  • 单击"确定">
  • 点击应用图标
  • 重新编译并快乐:)