我有一个 C 项目,我正在尝试使用 CMake 进行编译。这是我的项目结构:
root
├─ CMakeLists.txt
├─ docs
├─ build
└─ src
├─ main.c
├─ library1.h
├─ library2.h
├─ ...
该项目需要我正在使用 CMocka 的单元测试,其中引用了main.c
:
#include <stdio.h>
#include <assert.h>
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>
void test_example()
{
assert_true(1);
}
int main(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_example),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}
我编写了一个 CMake 文件,用于将所有源文件编译到build
目录中,但它无法正常工作:
make[2]: Entering directory '/home/radu/workspace/c/tls-server/build'
[ 50%] Building C object CMakeFiles/craking.dir/src/main.c.o
/usr/bin/cc -std=c99 -lcmocka -o CMakeFiles/craking.dir/src/main.c.o -c /home/radu/workspace/c/tls-server/src/main.c
[100%] Linking C executable craking
/usr/bin/cmake -E cmake_link_script CMakeFiles/craking.dir/link.txt --verbose=1
/usr/bin/cc -std=c99 -lcmocka -rdynamic CMakeFiles/craking.dir/src/main.c.o -o craking
/usr/bin/ld: CMakeFiles/craking.dir/src/main.c.o: in function `test_example':
main.c:(.text+0x1d): undefined reference to `_assert_true'
/usr/bin/ld: CMakeFiles/craking.dir/src/main.c.o: in function `main':
main.c:(.text+0x88): undefined reference to `_cmocka_run_group_tests'
collect2: error: ld returned 1 exit status
在上面,我注意到参数顺序是错误的:
/usr/bin/cc -std=c99 -lcmocka -rdynamic CMakeFiles/craking.dir/src/main.c.o -o craking
而我认为应该是:
/usr/bin/cc CMakeFiles/craking.dir/src/main.c.o -std=c99 -lcmocka -rdynamic -o craking
CMake 似乎颠倒了导致链接器出现问题的参数顺序,但我不知道如何解决这个问题。这是我的 CMake 文件:
cmake_minimum_required(VERSION 3.0)
project(craking)
file(GLOB_RECURSE src
"src/*.h"
"src/*.c"
)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-std=c99 -lcmocka")
add_executable(${PROJECT_NAME} src/main.c)
有任何想法吗?