Модульное тестирование CMake - неразрешенный внешний символ - PullRequest
5 голосов
/ 10 июля 2020

Я новичок в 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)

src / 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)

test / CMakeLists.txt:

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. Я либо угадывал, либо копировал на всех этих конфигурациях.

1 Ответ

0 голосов
/ 15 июля 2020

Каждый файл 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() имеют смысл, связывание будет автоматизировано.

Некоторые потоки с подробнее:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...