CMake单元测试-未解析的外部符号 我对C++和CMake比较陌生。我正在尝试创建一个库,当我尝试运行单元测试时,会出现错误。从我的研究中,我已经收集了“未解决的外部符号”错误的含义,但我无法找出如何修复它
以下是我的项目结构:CMake单元测试-未解析的外部符号 我对C++和CMake比较陌生。我正在尝试创建一个库,当我尝试运行单元测试时,会出现错误。从我的研究中,我已经收集了“未解决的外部符号”错误的含义,但我无法找出如何修复它,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 CMakeLists.txt: cmake_minimum_required (VERSION 3.8) p
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)
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)
add_executable (ogl-test "ogl-test.cpp" "ogl-test.h")
target_link_libraries(ogl-test ogl-renderer)
src/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)
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)
add_executable (ogl-test "ogl-test.cpp" "ogl-test.h")
target_link_libraries(ogl-test ogl-renderer)
test/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)
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)
add_executable (ogl-test "ogl-test.cpp" "ogl-test.h")
target_link_libraries(ogl-test ogl-renderer)
test/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文件修复错误的原因
配置每个项目后,将使用定义链接库
例如,在src
中,行目标链接库(ogl渲染器glfw)
将链接到glfw
。在test
中,行target\u link\u库(ogl-test-ogl-renderer)
将链接到您的src
可执行文件
只要target\u link\u libraries()
命令有意义,链接就会自动进行
包含更多信息的一些线程:
NglRenderer::startRenderer
中的NglRenderer::createWindow
是我的库的名称空间,在src/ogl渲染器中定义,我指的是实际的库。将两个链接到测试中:glfw
和ogl渲染器
@StephenNewell啊,对了,glfw是OpenGL。它正在src
文件夹中使用。现在我想起来了,我可能不需要在测试中链接它。add_library(ogl renderer)
没有必要在一行长的代码中添加新行,您可以在源文件之间添加新行。\include./src/ogl renderer.h”
只是目标目录(…${CMAKE_CURRENT_source DIR})
和do#include
NglRenderer是我的库的名称空间,在src/ogl renderer
Soogl renderer.cpp
在add_library
中缺失,因此……符号缺失。为什么缺失?为什么不添加它?add_test(ogl renderer olg test)
看起来很奇怪,你想运行ogl renderer
exe吗?我猜你想add_test(名称ogl test命令ogl test)
。所以从你说的话来看,我的看起来像是遵循了所有这些。一个带有测试的典型项目配置实际上是什么样子?@chrispytes,是的,应该可以。enable_testing()是标准的方式,添加了一些带有更多信息的链接。