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

chr*_*oes 5 c++ cmake

我对 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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

源代码/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)
Run Code Online (Sandbox Code Playgroud)

测试/CMakeLists.txt:

add_executable (ogl-test "ogl-test.cpp" "ogl-test.h")

target_link_libraries(ogl-test ogl-renderer)
Run Code Online (Sandbox Code Playgroud)

测试/ogl-test.cpp:

#include "../src/ogl-renderer.h"

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

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

int main() {
    testWindow();
}
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

我可以通过在每个位置始终包含 .h 和 .cpp 文件来修复它,但我想以正确的方式解决这个问题。我知道我需要将源项目编译成一个库,然后将它链接到测试可执行文件,但我不知道如何正确地做到这一点。我什至不完全确定我的 CMakeList.txt 文件有多正确。我猜测或复制了所有这些配置。

Cos*_*rvu 1

每个 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()命令有意义,链接就会自动进行。

一些包含更多信息的线程: