我在下面定义了一个包含src和test目录的项目结构。
├── CMakeLists.txt
├── src
│ ├── CMakeLists.txt
│ ├── table.c
│ └── table.h
├── test
│ ├── CMakeLists.txt
│ └── test_table.c
├── build
├── src [src build]
└── test [src + test build with UNIT_TESTING defined]
我想配置cmake,以便在构建测试(单元测试)目录时,它还使用UNIT_TESTING定义集编译./src目录中的文件,并将所有构建工件放入./build / test / directory。
这样,当UNIT_TESTING和真正的内存分配在正常构建时没有单元测试时,我可以通过使用malloc free等的包装函数来跟踪内存泄漏。
有谁知道如何让我入手?
答案 0 :(得分:1)
首先,我建议out-of-source-build这样:
├── build
│ ├── src
│ └── test
└── code
├── CMakeLists.txt
├── src
│ ├── CMakeLists.txt
│ ├── table.c
│ └── table.h
└── test
└── CMakeLists.txt
└── test_table.c
code
中的顶级CMakeLists.txt如下所示:
project(example)
set(BUILD_TESTS FALSE CACHE BOOL "Build unit tests")
if(BUILD_TESTS)
add_definitions(-DUNIT_TESTING)
add_subdirectory(test)
endif()
add_subdirectory(src)
然后将项目配置两次:
cmake ../../code
在构建/测试中 cmake -DBUILD_TESTS:BOOL=TRUE ../../code
醇>
(2。)将使用附加src
构建test
和#define
,而(1.)仅构建src
。
答案 1 :(得分:1)
使用How to build a program with 2 different values of a variable in CMake进一步回答,您甚至可以在一个生成的构建环境中执行此操作。
<强>的CMakeLists.txt 强>
cmake_minimum_required(VERSION 2.8)
project(Example C)
add_subdirectory(src)
add_subdirectory(test)
<强>的src /的CMakeLists.txt 强>
set(inFiles table.c table.h)
add_library(TableLib ${inFiles})
add_library(TestTableLib ${inFiles})
set_property(TARGET TestTableLib APPEND PROPERTY COMPILE_DEFINITIONS "UNIT_TESTING")
<强>测试/的CMakeLists.txt 强>
add_executable(TestTableExe test_table.c)
add_dependencies(TestTableExe TestTableLib)
# add_test(NAME RunTableTest COMMAND ...)
CMake会注意TableLib
和TestTableLib
的编译器输出最终会出现在不同的目录中。
唯一的缺点是您将拥有两个具有相同源文件的目标(TableLib
和TestTableLib
)。但是你可以在一些具有FOLDER目标属性的IDE中对它们进行分组。
另一种方法是将您需要的文件直接编译到测试中。如果你有嘲笑/存根的东西并且你不想要,或者你无法链接所有的依赖关系,那么这有时会非常方便。&#34;代码会被测试&#34;。
test / CMakeLists.txt (包含所有来源的版本)
include_directories(../src)
add_definitions(-DUNIT_TESTING)
add_executable(TestTableExe test_table.c ../src/table.c ../src/table.h)
# add_test(NAME RunTableTest COMMAND ...)