Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake单元测试-未解析的外部符号 我对C++和CMake比较陌生。我正在尝试创建一个库,当我尝试运行单元测试时,会出现错误。从我的研究中,我已经收集了“未解决的外部符号”错误的含义,但我无法找出如何修复它_C++_Cmake - Fatal编程技术网

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

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


什么库是?@StephenNewell
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
So
ogl renderer.cpp
add_library
中缺失,因此……符号缺失。为什么缺失?为什么不添加它?
add_test(ogl renderer olg test)
看起来很奇怪,你想运行
ogl renderer
exe吗?我猜你想
add_test(名称ogl test命令ogl test)
。所以从你说的话来看,我的看起来像是遵循了所有这些。一个带有测试的典型项目配置实际上是什么样子?@chrispytes,是的,应该可以。enable_testing()是标准的方式,添加了一些带有更多信息的链接。