【问题标题】:in gtest, how to add lib file to executable test file在gtest中,如何将lib文件添加到可执行测试文件中
【发布时间】:2015-10-26 17:08:40
【问题描述】:

我总是得到undefined reference to m(),这是我的代码:

ex.c

#include "stdio.h"

void m() {

}

ex.h

void m();

ex_test.cpp

#include "gtest/gtest.h"
#include "ex.h"

TEST(m, 1) {
    m();
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(try)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(src ex.c)
add_executable(try ${src})
add_subdirectory(gtest)
include_directories(${gtest_SOURCE_DIR} ${gtest_SOURCE_DIR}/include)
add_executable(ex_test ex_test.cpp ex.c)
target_link_libraries(ex_test gtest gtest_main)

这是我在 clion 中的 output(对不起,当我复制它时,sof 会引发“主要是代码”错误

【问题讨论】:

  • undefined reference 用于什么符号?如果您可以添加逐字链接错误,那就太好了。
  • @AntonioPérez 这是“m()”,我已经更新了
  • 符号m() 似乎只在ex_test.cpp 中被引用并在ex.c 中定义,并且两者都是可执行文件ex_test 的源列表的一部分,因此链接器毫无意义无法解析引用。请复制并粘贴链接器输出消息作为问题的一部分。肯定有相关信息可以回答您的问题。
  • @AntonioPérez “链接器输出”是什么意思,我刚学c。
  • 调用make后在控制台得到的完整输出

标签: c++ c cmake googletest


【解决方案1】:

ex.c 编译为 C。ex_test.cpp 编译为 C++ 但指 m() 来自ex.c,所以在ex_test.cpp 中需要通知编译器 ex.h 中的声明具有 C 链接(因此没有名称修改)。

替换:

#include "ex.h"

与:

extern "C" {
#include "ex.h"
}

【讨论】:

    【解决方案2】:

    您的问题标题刚刚指出了问题所在:您应该将ex 的库添加到ex_test 所需的库文件中。

    编译ex.c,然后将编译结果文件ex.a追加到ex_test需要的库文件中。你可以通过write CMakeLists.txt 文件来做到这一点,如下所示:

    add_library(ex ex.c)
    target_link_libraries(ex_test ex gtest gtest_main)
    

    【讨论】:

    • 这不是问题,他将ex.c 包含在ex_test 可执行文件的源列表中。
    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多