c/c++开发分享多个目录中的头文件:最佳实践

我是C Newb

我用动态语言(javascript,python,haskell等)写了很多代码,但我现在正在为研究生院学习C,我不知道我在做什么。

问题

最初我使用makefile在一个目录中构建我的所有源代码,该代码运行得相当好。 但是,我的项目正在增长,我想将源分成多个目录(unit testing,工具,核心等)。 例如,我的目录树可能如下所示:

. |-- src | |-- foo.c | |-- foo.h | `-- main.c `-- test `-- test_foo.c 

test/test_foo.c使用src/foo.csrc/foo.h test/test_foo.c 使用makefile,构建它的最佳/标准方法是什么? 优选地,将存在用于构建项目的一个规则和用于构建测试的规则。

注意

我知道还有其他方法可以做到这一点,包括autoconf和其他自动解决方案。 但是,我想了解发生了什么,并且能够从头开始编写makefile,尽管它可能不切实际。

任何指导或提示将不胜感激。 谢谢!

[编辑]

所以到目前为止给出的三个解决方案如下:

到目前为止,我喜欢-I switch解决方案,因为它不涉及在目录结构更改时更改源代码。

    对于test_foo.c,您只需告诉编译器可以找到头文件的位置。 例如

     gcc -I../src -c test_foo.c 

    然后编译器也会查看此目录以查找头文件。 在test_foo.c中,你写了:

     #include "foo.h" 

    编辑 :要链接foo.c,实际上反对foo.o,你需要在目标文件列表中提及它。 我假设你已经有了目标文件,然后在那之后做:

     gcc test_foo.o ../src/foo.o -o test 

    我也很少使用GNU autotools。 相反,我会在根目录中放置一个手工制作的makefile。

    要获取源目录中的所有标头,请使用以下内容:

     get_headers = $(wildcard $(1)/*.h) headers := $(call get_headers,src) 

    然后,您可以使用以下命令使测试目录中的对象文件依赖于以下标头:

     test/%.o : test/%.c $(headers) gcc -std=c99 -pedantic -Wall -Wextra -Werror $(flags) -Isrc -g -c -o $@ $< 

    如您所见,我不喜欢内置指令。 还要注意-I开关。

    获取目录的目标文件列表稍微复杂一些:

     get_objects = $(patsubst %.c,%.o,$(wildcard $(1)/*.c)) test_objects = $(call get_objects,test) 

    以下规则将为您的测试创建对象:

     test : $(test_objects) 

    test规则不应只是制作目标文件,而是制作可执行文件。 如何编写规则取决于测试的结构:例如,您可以为每个.c文件创建一个可执行文件,或者只为一个测试所有.c文件的文件创建一个可执行文件。

    执行此操作的常用方法是将单个C文件使用的头文件命名为与该C文件相同且位于同一目录中的头文件,以及许多C文件(尤其是整个项目使用的文件)使用的头文件在include与C源目录并行的目录中。

    您的测试文件应该直接使用相对路径包含头文件,如下所示:

     #include "../src/foo.h" 

      以上就是c/c++开发分享多个目录中的头文件:最佳实践相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545945.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注