配置Cmake文件的库依赖性

时间:2019-01-20 21:35:49

标签: c makefile cmake cmocka

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

有什么想法吗?

0 个答案:

没有答案