我对CMake文档有一段时间的理解。我编程生涯中的大部分时间都是在C#。所以这是新的。
我所拥有的是这样的目录结构:
- bin/
-- <empty>
- include/
-- cmocka.h
-- cmocka_pbc.h
-- cmocka_private.h
- lib/
-- libcmocka.dll.a
- src/
-- jargon/
| -- <*.c *.h>
- testing/
-- jargon_test/
| -- main.c (executable console)
| -- <*.c *.h> 我一直在研究CMakeLists.txt,如下所示:
cmake_minimum_required(VERSION 3.20)
project(jargon_test C)
set(CMAKE_C_STANDARD 11)
add_executable(jargon_test main.c token_tests.h token_tests.c)
include_directories(
"../../src/jargon/"
"../../include"
)
add_library(cmocka SHARED IMPORTED)
set_target_properties(cmocka
PROPERTIES
IMPORTED_LOCATION "../../lib/libcmocka.dll.a"
INTERFACE_INCLUDE_DIRECTORIES "../../include/cmocka"
)我使用的是CLion 2021.2.3。
尝试构建时,我会得到以下错误:
CMakeFiles\jargon_test.dir/objects.a(token_tests.c.obj):In function test_hello': *directory*:29: undefined reference to _assert_true` CMakeFiles\jargon_test.dir/objects.a(token_tests.c.obj):In function run_token_tests': *directory*:47: undefined reference to _cmocka_run_group_tests`
消息来源本身没有任何问题。但是,为了完整起见,以下是源文件:
// token_tests.h
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <stdint.h>
#include <cmocka.h>
#include "jargon.h"
#ifndef JARGON_TOKEN_TESTS_H
#define JARGON_TOKEN_TESTS_H
void test_hello(void ** state);
int setup(void ** state);
int teardown(void ** state);
int run_token_tests(void);
#endif //JARGON_TOKEN_TESTS_H
// token_tests.c
#include "token_tests.h"
void test_hello(void ** state) {
int ret = 0;
assert_true(ret == 0);
}
int setup (void ** state) {
printf("executing test\n");
return 0;
}
int teardown (void ** state) {
return 0;
}
int run_token_tests(void) {
const struct CMUnitTest tests [] = {
cmocka_unit_test(test_hello)
};
int count_fail_tests = cmocka_run_group_tests(tests, setup, teardown);
return count_fail_tests;
}发布于 2021-11-17 20:13:00
似乎cmocka库没有链接到您的可执行文件,请添加target_link_libraries(jargon_test cmocka)
另外,可能您的一些函数定义(c文件中的实现)没有提供给cmake脚本。
尝试像这样更新您的cmake脚本:
e been working on CMakeLists.txt as follows:
cmake_minimum_required(VERSION 3.20)
project(jargon_test C)
set(CMAKE_C_STANDARD 11)
add_executable(jargon_test main.c token_tests.h token_tests.c ../../src/jargon/xxxx.c)
include_directories(
"../../src/jargon/"
"../../include"
)
add_library(cmocka SHARED IMPORTED)
set_target_properties(cmocka
PROPERTIES
IMPORTED_LOCATION "../../lib/libcmocka.dll.a"
INTERFACE_INCLUDE_DIRECTORIES "../../include/cmocka"
}
target_link_libraries(jargon_test cmocka) 要获得更干净的cmake脚本,请尝试采用自顶向下的方法(包括位于子目录中的顶级CMakeLists.txt ),并在src/专业术语文件夹中声明一个“专业术语”库。因此,在您的测试文件夹中,您只需添加c测试文件,并链接您的“专业术语”库和测试工具。
https://stackoverflow.com/questions/70008892
复制相似问题