首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何配置CMakeList以正确链接?

如何配置CMakeList以正确链接?
EN

Stack Overflow用户
提问于 2021-11-17 17:23:22
回答 1查看 138关注 0票数 0

我对CMake文档有一段时间的理解。我编程生涯中的大部分时间都是在C#。所以这是新的。

我所拥有的是这样的目录结构:

代码语言:javascript
复制
- 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,如下所示:

代码语言:javascript
复制
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`

消息来源本身没有任何问题。但是,为了完整起见,以下是源文件:

代码语言:javascript
复制
// 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;
}
EN

回答 1

Stack Overflow用户

发布于 2021-11-17 20:13:00

似乎cmocka库没有链接到您的可执行文件,请添加target_link_libraries(jargon_test cmocka)

另外,可能您的一些函数定义(c文件中的实现)没有提供给cmake脚本。

尝试像这样更新您的cmake脚本:

代码语言:javascript
复制
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测试文件,并链接您的“专业术语”库和测试工具。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70008892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档