[英]Why do I have to re-include header files in C when running Ceedling?
I have a C project which I intend to test with Ceedling, CMock, and Unity stack.我有一个 C 项目,我打算使用 Ceedling、CMock 和 Unity 堆栈对其进行测试。 I do have an issue when running tests...
我在运行测试时确实遇到了问题......
My project structure is below我的项目结构如下
mytest
├── lib
│ ├── bar.c
│ └── include
│ └── bar.h
├── project.yml
├── src
│ ├── foo.c
│ └── include
│ └── foo.h
└── test
├── support
└── test_foo.c
And my Ceedling project.yml file还有我的 Ceedling project.yml 文件
---
# Notes:
# Sample project C code is not presently written to produce a release artifact.
# As such, release build options are disabled.
# This sample, therefore, only demonstrates running a collection of unit tests.
:project:
:use_exceptions: FALSE
:use_test_preprocessor: TRUE
:use_auxiliary_dependencies: TRUE
:build_root: build
# :release_build: TRUE
:test_file_prefix: test_
:which_ceedling: gem
:ceedling_version: 0.31.1
:default_tasks:
- test:all
#:test_build:
# :use_assembly: TRUE
#:release_build:
# :output: MyApp.out
# :use_assembly: FALSE
:environment:
:extension:
:executable: .out
:paths:
:test:
- +:test/**
- -:test/support
:source:
- src/**
- src/include
- lib/**
- lib/include
:support:
- test/support
:libraries: []
:defines:
# in order to add common defines:
# 1) remove the trailing [] from the :common: section
# 2) add entries to the :common: section (e.g. :test: has TEST defined)
:common: &common_defines []
:test:
- *common_defines
- TEST
:test_preprocess:
- *common_defines
- TEST
:cmock:
:mock_prefix: mock_
:when_no_prototypes: :warn
:enforce_strict_ordering: TRUE
:plugins:
- :ignore
- :callback
:treat_as:
uint8: HEX8
uint16: HEX16
uint32: UINT32
int8: INT8
bool: UINT8
# Add -gcov to the plugins list to make sure of the gcov plugin
# You will need to have gcov and gcovr both installed to make it work.
# For more information on these options, see docs in plugins/gcov
:gcov:
:reports:
- HtmlDetailed
:gcovr:
:html_medium_threshold: 75
:html_high_threshold: 90
#:tools:
# Ceedling defaults to using gcc for compiling, linking, etc.
# As [:tools] is blank, gcc will be used (so long as it's in your system path)
# See documentation to configure a given toolchain for use
# LIBRARIES
# These libraries are automatically injected into the build process. Those specified as
# common will be used in all types of builds. Otherwise, libraries can be injected in just
# tests or releases. These options are MERGED with the options in supplemental yaml files.
:libraries:
:placement: :end
:flag: "-l${1}"
:path_flag: "-L ${1}"
:system: [] # for example, you might list 'm' to grab the math library
:test: []
:release: []
:plugins:
:load_paths:
- "#{Ceedling.load_path}"
:enabled:
- stdout_pretty_tests_report
- module_generator
...
bar.h:栏.h:
int addMe(int a, int b);
bar.c: bar.c:
#include "bar.h"
int addMe(int a, int b)
{
return a + b;
}
foo.h: foo.h:
#ifndef FOO_H
#define FOO_H
int addMore(int a, int b, int c);
#endif // FOO_H
foo.c: foo.c:
#include "bar.h"
#include "foo.h"
int addMore(int a, int b, int c)
{
return addMe(a, b) + c;
}
My test file test_foo.c looks like this:我的测试文件 test_foo.c 如下所示:
#include "unity.h"
#include "foo.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_foo_addMore(void)
{
printf("%d", addMore(1, 2, 3));
}
Running ceedling test:all
I get an error that says this:运行
ceedling test:all
我收到一条错误消息:
/usr/bin/ld: build/test/out/c/foo.o: in function `addMore':
/home/USER/mytest/src/foo.c:6: undefined reference to `addMe'
If Include the bar.h
header file everything works, but why do I have to do this?如果包含
bar.h
header 文件一切正常,但为什么我必须这样做? I included foo.h
where bar.h
is already included.我包含了
foo.h
,其中已经包含了bar.h
I added the src/include bin bin/include
file paths to the project.yml as well.我也将
src/include bin bin/include
文件路径添加到 project.yml 中。
So, why is this?那么,这是为什么呢?
Tried setting up the project the way I described and it did not act in the way I thought it would.尝试按照我描述的方式设置项目,但它没有按照我想象的方式运行。
If Include the bar.h header file everything works, but why do I have to do this?
如果包含 bar.h header 文件一切正常,但为什么我必须这样做?
Because that is how Ceedling works.因为这就是 Ceedling 的工作原理。 From the documentation :
从文档中:
Ceedling knows what files to compile and link into each individual test executable by way of the #include list contained in each test file.
通过包含在每个测试文件中的#include 列表,Ceedling 知道要编译哪些文件并将其链接到每个单独的测试可执行文件中。 Any C source files in the configured search directories that correspond to the header files included in a test file will be compiled and linked into the resulting test fixture executable.
配置的搜索目录中与测试文件中包含的 header 文件相对应的任何 C 源文件将被编译并链接到生成的测试夹具可执行文件中。
So, you need to explicitly include header file into test source file, so that Ceedling knows which source files to compile.因此,您需要明确地将 header 文件包含到测试源文件中,以便 Ceedling 知道要编译哪些源文件。 If you include
bar.h
, then it will look for bar.c
.如果您包含
bar.h
,那么它将查找bar.c
。 Note that build will fail if your .c
file is called something else, like bar_new.c
.请注意,如果您的
.c
文件被称为其他名称,例如bar_new.c
,构建将失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.