gpt4 book ai didi

c++ - CMake 单元测试 - 未解析的外部符号

转载 作者:行者123 更新时间:2023-12-01 13:47:53 32 4
gpt4 key购买 nike

我对 C++ 和 CMake 比较陌生。我正在尝试创建一个库,但在尝试运行单元测试时出现错误。从我的研究中,我已经收集了“未解析的外部符号”错误的含义,但我无法弄清楚如何修复它。
这是我的项目结构:

lib
glfw - GLFW source folder
src
ogl-renderer.cpp
ogl-renderer.h
CMakeLists.txt
...additional source files
test
ogl-test.cpp
ogl-test.h
CMakeLists.txt
CMakeLists.txt
CMakeLists.txt:
cmake_minimum_required (VERSION 3.8)

project("ogl-renderer")

set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)

add_subdirectory ("lib/glfw-3.3.2")

add_subdirectory ("src")
add_subdirectory ("test")

enable_testing()

add_test (ogl-renderer olg-test)
源代码/CMakeLists.txt:
cmake_minimum_required (VERSION 3.8)

add_library (ogl-renderer "engine/renderer.cpp" "engine/renderer.h" "engine/renderer.cpp" "engine/renderer.h" "engine/Window.cpp" "engine/Window.h" "engine/Shape.cpp" "engine/Shape.h" "engine/message-queue.cpp" "engine/message-queue.h" "engine/messages/window-mgmt.h" "engine/messages/window-mgmt.cpp")

target_link_libraries(ogl-renderer glfw)
测试/CMakeLists.txt:
add_executable (ogl-test "ogl-test.cpp" "ogl-test.h")

target_link_libraries(ogl-test ogl-renderer)
测试/ogl-test.cpp:
#include "../src/ogl-renderer.h"

void testWindow() {
NglRenderer::startRenderer();

int windowId = NglRenderer::createWindow("Test", 640, 480);
}

int main() {
testWindow();
}
错误:
Error   LNK2019 unresolved external symbol "void __cdecl NglRenderer::startRenderer(void)" (?startRenderer@NglRenderer@@YAXXZ) referenced in function "void __cdecl testWindow(void)" (?testWindow@@YAXXZ)  C:\Users\chansen\source\repos\ogl-renderer\out\build\x64-Debug\ogl-renderer C:\Users\chansen\source\repos\ogl-renderer\out\build\x64-Debug\ogl-test.cpp.obj 1

Error LNK2019 unresolved external symbol "int __cdecl NglRenderer::createWindow(char *,int,int)" (?createWindow@NglRenderer@@YAHPEADHH@Z) referenced in function "void __cdecl testWindow(void)" (?testWindow@@YAXXZ) C:\Users\chansen\source\repos\ogl-renderer\out\build\x64-Debug\ogl-renderer C:\Users\chansen\source\repos\ogl-renderer\out\build\x64-Debug\ogl-test.cpp.obj 1
我可以通过在每个位置始终包含 .h 和 .cpp 文件来修复它,但我想以正确的方式解决这个问题。我知道我需要将源项目编译成一个库,然后将它链接到测试可执行文件,但我不知道如何正确地做到这一点。我什至不完全确定我的 CMakeList.txt 文件有多正确。我猜测或复制了所有这些配置。

最佳答案

每个 CMakeLists.txt 文件定义一个要编译的项目。每个项目都必须包含其所有文件、依赖项和构建选项。
所以"test/CMakeLists.txt"必须包含所有相关 test源文件。和 "src/CMakeLists.txt"必须包含所有相关 src源文件。这就是添加 .h 和 .cpp 文件修复错误的原因。
每个项目配置完成后,链接库定义为 target_link_libraries() .
例如在 src线路target_link_libraries(ogl-renderer glfw)将链接到 glfw .而在 test线路target_link_libraries(ogl-test ogl-renderer)将链接到您的 src可执行。
只要target_link_libraries()命令有意义,链接将自动进行。
一些包含更多信息的线程:

  • What does enable_testing() do in cmake?
  • How to start working with GTest and CMake
  • 关于c++ - CMake 单元测试 - 未解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62836167/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com