简体   繁体   English

为什么我在运行Ceedling时必须在C中重新包含header个文件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM