如何将 .c 和 .h 文件存储在包含路径中,与当前项目的源代码分开
How to store .c and .h files in an includepath, separate from source code of current project
我试图缩短我的问题(旧问题仍然可以在下面找到(
我当前的目录结构如下所示
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
目录中。 我看到你的问题至少有三种解决方案:
如果您真的想
#include
源文件(我不建议您这样做(,只需使用文件的相对路径,即#include "....utilitysrcfile1.c"
现在,除了包含源文件的问题之外,这往往非常脆弱,因为如果您更改目录结构(或更改目录名称(,一切都会中断。 您需要返回源代码并修复每一行代码。
正如 iharob 建议的那样,使用 make 文件来处理这个问题。 在这种情况下,您将有一个如下所示的编译行(假设您使用的是Microsoft的工具更改(;
cl /I....utilityinclude ....utilitysrcfile1.c /o util_file1.o
这会导致编译结果删除在当前工作目录中,链接器将能够找到所有目标文件并将它们合并到一个可执行文件中。 我们仍然在这里处理相对路径,但所有更改都将在一个文件中,并且通过使用 make 变量,更改将在一两行上。
- 如果实用程序目录中的函数将在多个项目中使用,我个人最喜欢的解决方案是创建一个实用程序项目,生成一个动态库(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
- 单击"确定">
- 点击应用图标
- 重新编译并快乐:)
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- SQLite - 从源代码构建库或将源代码直接包含在我的项目中
- 如何将另一个项目中用 C 编写的源代码包含在我自己的项目中,C++在 Visual Studio 中
- 我应该通过 API 还是通过项目的源代码本身使用英特尔 Embree?
- 如何共享我的 C/C++ 项目并隐藏一些源代码
- 如何在我的C++项目中使用 CLIPS 源代码
- 如何将Paraview源代码编译到QT项目(.pro)
- C++14/17 项目可以使用使用 C++11 标准编译的二进制库还是需要重新编译源代码
- 我正在为我的C 项目添加Offocial SQLite源代码,并获得链接器错误
- Visual Studio 2010-源代码从项目文件夹中消失
- 如何在不将库源代码添加到我的项目中的情况下将库链接到 CodeBlocks 和 GCC 中的项目
- 在Haskell项目中包含C++源代码
- 如何将 .c 和 .h 文件存储在包含路径中,与当前项目的源代码分开
- 从源代码项目中提取所有函数的工具
- SDL 项目的调试错误"没有可用于 main() 的源代码"
- 如何编译没有项目文件的源代码C++代码?
- 可视化 如何在项目中使用多个C++源代码文件
- CMake 从公共源代码树生成多个项目的方法
- TFS 2010 源代码管理下的 VS2010 解决方案保留C++项目时在打开时发出警告
- 链接项目源代码与boost测试下的CMake