繁体   English   中英

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

[英]Why do I have to re-include header files in C when running Ceedling?

我有一个 C 项目,我打算使用 Ceedling、CMock 和 Unity 堆栈对其进行测试。 我在运行测试时确实遇到了问题......

我的项目结构如下

mytest
    ├── lib
    │   ├── bar.c
    │   └── include
    │       └── bar.h
    ├── project.yml
    ├── src
    │   ├── foo.c
    │   └── include
    │       └── foo.h
    └── test
        ├── support
        └── test_foo.c

还有我的 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
...

栏.h:

int addMe(int a, int b);

bar.c:

#include "bar.h"

int addMe(int a, int b) 
{
    return a + b;
}

foo.h:

#ifndef FOO_H
#define FOO_H

    int addMore(int a, int b, int c);

#endif // FOO_H

foo.c:

#include "bar.h"
#include "foo.h"

int addMore(int a, int b, int c)
{
    return addMe(a, b) + c;
}

我的测试文件 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));
}

运行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'

如果包含bar.h header 文件一切正常,但为什么我必须这样做? 我包含了foo.h ,其中已经包含了bar.h

我也将src/include bin bin/include文件路径添加到 project.yml 中。

那么,这是为什么呢?

尝试按照我描述的方式设置项目,但它没有按照我想象的方式运行。

如果包含 bar.h header 文件一切正常,但为什么我必须这样做?

因为这就是 Ceedling 的工作原理。 文档中:

通过包含在每个测试文件中的#include 列表,Ceedling 知道要编译哪些文件并将其链接到每个单独的测试可执行文件中。 配置的搜索目录中与测试文件中包含的 header 文件相对应的任何 C 源文件将被编译并链接到生成的测试夹具可执行文件中。

因此,您需要明确地将 header 文件包含到测试源文件中,以便 Ceedling 知道要编译哪些源文件。 如果您包含bar.h ,那么它将查找bar.c 请注意,如果您的.c文件被称为其他名称,例如bar_new.c ,构建将失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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