1

我有一个 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)

有任何想法吗?

4

0 回答 0