使用 cmake 和 doctest.h 时出现链接器错误(它在没有 cmake 的情况下工作)
Linker error when using cmake and doctest.h (it's working without cmake)
我的目录“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*)'
之后还有很多未定义的引用。我该怎么办?
您已经创建了目标名称为 doctest_main.cpp
且只有一个源文件的可执行文件。
add_executable
应更改为以下内容以创建名称为 a
的目标,默认情况下生成的可执行文件被命名为 a
(或 a.exe
windows):
# extra whitespaces/newlines not needed below, but a personal style preference.
add_executable(a
doctest_main.cpp
tests.cpp
)
此外,我建议也将头文件添加为源,因为像 Visual Studio 这样的 IDE 不会将它们列在属于 a
目标的头文件下。
我的目录“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*)'
之后还有很多未定义的引用。我该怎么办?
您已经创建了目标名称为 doctest_main.cpp
且只有一个源文件的可执行文件。
add_executable
应更改为以下内容以创建名称为 a
的目标,默认情况下生成的可执行文件被命名为 a
(或 a.exe
windows):
# extra whitespaces/newlines not needed below, but a personal style preference.
add_executable(a
doctest_main.cpp
tests.cpp
)
此外,我建议也将头文件添加为源,因为像 Visual Studio 这样的 IDE 不会将它们列在属于 a
目标的头文件下。