【问题标题】:Linker error when using cmake and doctest.h (it's working without cmake)使用 cmake 和 doctest.h 时出现链接器错误(它在没有 cmake 的情况下工作)
【发布时间】:2021-12-30 16:09:06
【问题描述】:

我的目录“project”中有 3 个文件:doctest.h - 测试库,doctest_main.cpp - 库所需的文件,tests.cpp - 包含测试的文件。

project/doctest_main.cpp:

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "doctest.h"

project/tests.cpp:

#include "doctest.h"

TEST_CASE("Some test_case") {
    CHECK(2 + 2 == 4);
}

当我手动编译所有内容时,它可以工作:

project> g++ -std=c++17 -Wall -Wextra -Werror doctest_main.cpp tests.cpp -o a
project> ./a

我尝试以这种方式添加 CMake:

project/CmakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(project)

set(CMAKE_CXX_STANDARD 17)

add_compile_options(-Wall -Wextra -Werror)

add_executable(
    doctest_main.cpp tests.cpp)

现在我需要构建 CMake。跟着官方教程走吧:

project> mkdir build
project/build> cd build
project/build> cmake ..  # Ok!
project/build> cmake --build .  # Linker error

错误如下:

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
/usr/bin/ld: CMakeFiles/doctest_main.cpp.dir/tests.cpp.o: in function `_DOCTEST_ANON_FUNC_2()':
tests.cpp:(.text+0x55): undefined reference to `doctest::detail::ResultBuilder::ResultBuilder(doctest::assertType::Enum, char const*, int, char const*, char const*, char const*)'

在那之后还有很多未定义的引用。我该怎么办?

【问题讨论】:

标签: c++ cmake linker-errors doctest


【解决方案1】:

您已经创建了一个目标名称为 doctest_main.cpp 的可执行文件,并且只有一个源文件。

add_executable 应更改为以下内容以创建名称为 a 的目标,默认情况下生成的可执行文件名为 a(或 Windows 上的 a.exe):

# extra whitespaces/newlines not needed below, but a personal style preference.
add_executable(a

    doctest_main.cpp
    tests.cpp
)

此外,我还建议将头文件添加为源文件,因为像 Visual Studio 这样的 IDE 不会将它们列在属于 a 目标的头文件下。

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 2017-05-29
    • 2015-12-07
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多