如何将 .c 和 .h 文件存储在包含路径中,与当前项目的源代码分开
How to store .c and .h files in an includepath, separate from source code of current project
我试图缩短我的问题(旧问题仍然可以在下面找到)
我当前的目录结构是这样的
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 和 #include <file.h>
中的 .h 文件包含到 proj1将路径 包含到我的 IDE (在 proj1 中)。 ..\utility\src 文件是否有等效的解决方案?我在 Windows 7 上使用 LPCXpresso IDE。我想在任何 IDE 上都有相同的解决方案,所以我只想知道这个 无论路径如何 (如果在.\src目录下找不到,会去哪里找.c文件)一般都是调用在我的工程设置里找。
- 我尽量避免使用库(.lib、.dll)
- 我不想复制每个项目(proj1、proj2、...、projn)中的 .c 文件
- 我希望能够简单地编辑 .c 和 .h 文件,如果重新编译 proj1 等,将应用更改,因为它们适用于所有其他项目
- 生成自己的 makefile 可能是一个解决方案(但不应该有一个在 IDE 中添加源文件路径的选项吗?)
#include <..\utility\src>
是一个不受欢迎的解决方案,因为对目录的更改将强制在每个文件中添加这一行,而在选项中更改路径只需点击几下。
提前致谢并感谢您到目前为止的回答
我问题的旧版本:
动机:想象一下,你在C/C++中写了一个程序IDE并且像往常一样有.c和.h源代码文件.此外,您还有一个 helper.c 和 helper.h 文件,您是否定义了一些有用的、与项目无关的函数(可用于多个项目)。您想包含这些文件,但不想让它们存储您的项目相关源代码。
据我所知.h 文件可以存储在单独的文件夹中,由 includepath 指向。这个路径可以在每个 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
当然有,根据您使用的编译器,会有一个开关告诉编译器在哪里搜索 headers,对于 gcc
和其他一些 AFAIK,它是 -I
,所以例如假设你的 headers 在 myproject/headers
目录中,应该像这样调用编译器
gcc -I myproject/header ${OTHER_OPTIONS} ${SOURCE_OR_OBJECT_FILES} -o ${OUTPUT_FILE}
用不同目录中的 .c
文件构建项目的通常方法是使用 Makefile
和一个可以解析 Makefile
并调用必要命令的程序构建项目。
好的,假设你有这样的目录结构:
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
目录中。对于您的问题,我至少看到了三种解决方案:
如果你真的想要 #include
源文件,我不建议这样做,只需使用文件的相对路径即
#include "..\..\utility\src\file1.c"
现在除了包含源文件的问题外,这往往非常脆弱,因为如果您更改目录结构(或更改目录名称),一切都会崩溃。您需要返回源代码并修复每一行代码。
按照 iharob 的建议,使用 make 文件来处理这个问题。在这种情况下,您将拥有如下所示的编译行(假设您使用的是 Microsoft 的工具更改);
cl /I..\..\utility\include ..\..\utility\src\file1.c /o util_file1.o
这会导致编译结果被放入当前工作目录,linker 将能够找到所有目标文件并将它们组合成一个可执行文件。我们仍然在这里处理相对路径,但所有更改都将在一个文件中,并且通过使用 make 变量,更改将在一两行中。
- 如果utility目录下的函数要在多个项目中使用,我个人最喜欢的方案是做一个utility项目,生成动态库(windows下的一个dll)和link 该库的后续项目。您仍然需要处理定位包含文件的位置(可能是所有项目文件夹所在的顶层目录?),但对我来说,库似乎更干净。它还具有额外的优势,如果您想修改实用程序项目中的代码,只需重新编译库,您项目的其余部分将 'see' 修改而无需重新编译它们(假设您不修改界面图书馆)。
希望这对您有所帮助,
T
一句警告:#include
源 (.c) 文件通常不是一个好主意。源文件用于编译,而不是包含——包含它们可能会导致奇怪的错误(最突出的是,明显的函数重新定义)。
这是我会做的(对于每个需要帮助程序代码的项目):
- 将实用程序 .c 文件添加到项目中。寻找 添加现有文件... 或类似的 IDE 功能;这确保您的实用程序源文件,即
helper.c
,与您的项目一起编译。
- 至于 .h 文件,将其包含在
#include <helper.h>
中,使您能够使用实用程序声明。
- 最后,找到名为 Include paths、a.k.a 的编译器选项。 -I,设置为包含
helper.h
的文件夹。这通常在 Project options/settings. 中找到
查看所有设置和选项后,我找到了以下令人满意的解决方案:创建一个 Link 到源文件文件夹
此答案适用于 LPCXpresso IDE
- 想象一下我的问题中显示的文件夹结构
- 在 LPCXpresso 内部 IDE -> 右键单击项目 -> 属性
- 导航到 C/C++ 常规>路径和符号>源位置
- 点击"Link Folder..."
- 在打开的对话框中将复选框Link标记到文件系统中的文件夹
- 单击浏览...或输入 C:\users\documents\projects\utility\src
- 点击确定
- 点击应用
- 重新编译并开心:)
我试图缩短我的问题(旧问题仍然可以在下面找到)
我当前的目录结构是这样的
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 和 #include <file.h>
中的 .h 文件包含到 proj1将路径 包含到我的 IDE (在 proj1 中)。 ..\utility\src 文件是否有等效的解决方案?我在 Windows 7 上使用 LPCXpresso IDE。我想在任何 IDE 上都有相同的解决方案,所以我只想知道这个 无论路径如何 (如果在.\src目录下找不到,会去哪里找.c文件)一般都是调用在我的工程设置里找。
- 我尽量避免使用库(.lib、.dll)
- 我不想复制每个项目(proj1、proj2、...、projn)中的 .c 文件
- 我希望能够简单地编辑 .c 和 .h 文件,如果重新编译 proj1 等,将应用更改,因为它们适用于所有其他项目
- 生成自己的 makefile 可能是一个解决方案(但不应该有一个在 IDE 中添加源文件路径的选项吗?)
#include <..\utility\src>
是一个不受欢迎的解决方案,因为对目录的更改将强制在每个文件中添加这一行,而在选项中更改路径只需点击几下。
提前致谢并感谢您到目前为止的回答
我问题的旧版本:
动机:想象一下,你在C/C++中写了一个程序IDE并且像往常一样有.c和.h源代码文件.此外,您还有一个 helper.c 和 helper.h 文件,您是否定义了一些有用的、与项目无关的函数(可用于多个项目)。您想包含这些文件,但不想让它们存储您的项目相关源代码。
据我所知.h 文件可以存储在单独的文件夹中,由 includepath 指向。这个路径可以在每个 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
当然有,根据您使用的编译器,会有一个开关告诉编译器在哪里搜索 headers,对于 gcc
和其他一些 AFAIK,它是 -I
,所以例如假设你的 headers 在 myproject/headers
目录中,应该像这样调用编译器
gcc -I myproject/header ${OTHER_OPTIONS} ${SOURCE_OR_OBJECT_FILES} -o ${OUTPUT_FILE}
用不同目录中的 .c
文件构建项目的通常方法是使用 Makefile
和一个可以解析 Makefile
并调用必要命令的程序构建项目。
好的,假设你有这样的目录结构:
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
目录中。对于您的问题,我至少看到了三种解决方案:
如果你真的想要
#include
源文件,我不建议这样做,只需使用文件的相对路径即#include "..\..\utility\src\file1.c"
现在除了包含源文件的问题外,这往往非常脆弱,因为如果您更改目录结构(或更改目录名称),一切都会崩溃。您需要返回源代码并修复每一行代码。
按照 iharob 的建议,使用 make 文件来处理这个问题。在这种情况下,您将拥有如下所示的编译行(假设您使用的是 Microsoft 的工具更改);
cl /I..\..\utility\include ..\..\utility\src\file1.c /o util_file1.o
这会导致编译结果被放入当前工作目录,linker 将能够找到所有目标文件并将它们组合成一个可执行文件。我们仍然在这里处理相对路径,但所有更改都将在一个文件中,并且通过使用 make 变量,更改将在一两行中。
- 如果utility目录下的函数要在多个项目中使用,我个人最喜欢的方案是做一个utility项目,生成动态库(windows下的一个dll)和link 该库的后续项目。您仍然需要处理定位包含文件的位置(可能是所有项目文件夹所在的顶层目录?),但对我来说,库似乎更干净。它还具有额外的优势,如果您想修改实用程序项目中的代码,只需重新编译库,您项目的其余部分将 'see' 修改而无需重新编译它们(假设您不修改界面图书馆)。
希望这对您有所帮助, T
一句警告:#include
源 (.c) 文件通常不是一个好主意。源文件用于编译,而不是包含——包含它们可能会导致奇怪的错误(最突出的是,明显的函数重新定义)。
这是我会做的(对于每个需要帮助程序代码的项目):
- 将实用程序 .c 文件添加到项目中。寻找 添加现有文件... 或类似的 IDE 功能;这确保您的实用程序源文件,即
helper.c
,与您的项目一起编译。 - 至于 .h 文件,将其包含在
#include <helper.h>
中,使您能够使用实用程序声明。 - 最后,找到名为 Include paths、a.k.a 的编译器选项。 -I,设置为包含
helper.h
的文件夹。这通常在 Project options/settings. 中找到
查看所有设置和选项后,我找到了以下令人满意的解决方案:创建一个 Link 到源文件文件夹
此答案适用于 LPCXpresso IDE
- 想象一下我的问题中显示的文件夹结构
- 在 LPCXpresso 内部 IDE -> 右键单击项目 -> 属性
- 导航到 C/C++ 常规>路径和符号>源位置
- 点击"Link Folder..."
- 在打开的对话框中将复选框Link标记到文件系统中的文件夹
- 单击浏览...或输入 C:\users\documents\projects\utility\src
- 点击确定
- 点击应用
- 重新编译并开心:)