未解析的外部符号 LNK2019 CMake

Unresolved External Symbol LNK2019 CMake

我这里有一个名为引擎的 class,我正在尝试使用它,但是当我包含它时,出现了 LNK2019 错误。我是 运行 Visual Studio 2019 x86_64 编译器。任何想法可能是错的? 我在 cpp 文件中定义了构造函数和析构函数。

#pragma once

namespace NRD {

    const int SCREEN_WIDTH(1280);
    const int SCREEN_HEIGHT(720);

    class Engine {
    public:
        Engine();
        Engine(const Engine&) = delete;
        Engine& operator=(const Engine&) = delete;
        ~Engine();

        static Engine& Ref() {
            static Engine reference;
            return reference;
        }
    };

    static Engine& Core = Engine::Ref();
}

这是我的 cpp 文件:

#include "nrdengine/engine.h"
#include "nrdengine/service_locator.h"
#include "platform/glfw_window.h"

#include <iostream>

namespace NRD {
    Engine::Engine() {
        std::cout << "Initializing window!" << std::endl;

        ServiceLocator::Provide(new CustomWindow());
    }

    Engine::~Engine() {
        ServiceLocator::GetWindow()->DestroyWindow();
    }
}
[build] main.obj : error LNK2019: unresolved external symbol "public: __cdecl NRD::Engine::Engine(void)" (??0Engine@NRD@@QEAA@XZ) referenced in function "public: static class NRD::Engine & __cdecl NRD::Engine::Ref(void)" (?Ref@Engine@NRD@@SAAEAV12@XZ) [C:\Users\Dawid\Desktop\NRD-Engine\build\nrdengine_cpp_application.vcxproj]
[build] main.obj : error LNK2019: unresolved external symbol "public: __cdecl NRD::Engine::~Engine(void)" (??1Engine@NRD@@QEAA@XZ) referenced in function "void __cdecl `public: static class Engine::Ref & __cdecl NRD::Engine::Ref(void)'::`2'::`dynamic atexit destructor for 'reference''(void)" (??__Freference@?1??Ref@Engine@NRD@@SAAEAV12@XZ@YAXXZ) [C:\Users\Dawid\Desktop\NRD-Engine\build\nrdengine_cpp_application.vcxproj]
[build] C:\Users\Dawid\Desktop\NRD-Engine\build\Debug\nrdengine_cpp_application.exe : fatal error LNK1120: 2 unresolved externals [C:\Users\Dawid\Desktop\NRD-Engine\build\nrdengine_cpp_application.vcxproj]

我有两个 CMakeList 文件(一个用于 Engine 项目,一个用于 App)

应用程序:

cmake_minimum_required(VERSION 3.5)
project(nrdengine_cpp_application VERSION 0.0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)

add_subdirectory(external/engine)

file(GLOB_RECURSE SOURCE_FILES
    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c
    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
    
#nrdengine_cpp_application.exe
add_executable(nrdengine_cpp_application ${SOURCE_FILES})

target_link_libraries(nrdengine_cpp_application PUBLIC nrdengine_cpp_engine)
target_include_directories(nrdengine_cpp_application PUBLIC nrdengine_cpp_engine)

引擎:

cmake_minimum_required(VERSION 3.5)
project(nrdengine_cpp_engine VERSION 0.0.1 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)

#add external libs
#find_package(OpenGL REQUIRED)

# install python and Jinja2
set(GLAD_SOURCES_DIR "${PROJECT_SOURCE_DIR}/external/glad")
add_subdirectory("${GLAD_SOURCES_DIR}/cmake" glad_cmake)

add_subdirectory(external/glfw)
add_subdirectory(external/glm)
add_subdirectory(external/assimp)

file(GLOB_RECURSE SOURCE_FILES 
    ${CMAKE_SOURCE_DIR}/src/*.c
    ${CMAKE_SOURCE_DIR}/src/*.cpp)

glad_add_library(glad_gl_core_mx_31 REPRODUCIBLE MX API gl:core=3.1)

add_library(nrdengine_cpp_engine ${SOURCE_FILES})

target_include_directories(nrdengine_cpp_engine
    PUBLIC
        $<INSTALL_INTERFACE:include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        glm
    PRIVATE
        glfw
        assimp
)

target_link_libraries(${PROJECT_NAME}
    PUBLIC
        glm
    PRIVATE
        glad_gl_core_mx_31
        glfw
        assimp
)```

我有点猜测,因为你的问题有点难以回答,因为它可能有很多问题。但这是我的推论。


不建议像您在此处那样对源文件进行 glob。

file(GLOB_RECURSE SOURCE_FILES 
    ${CMAKE_SOURCE_DIR}/src/*.c
    ${CMAKE_SOURCE_DIR}/src/*.cpp)

注意:我的建议需要 3.13 或更高版本的 CMake。

这会导致很多问题,并且可能是您遇到问题的原因。请参阅其中一位 CMake 维护者的 post,了解如何将源文件添加到您的项目。

https://crascit.com/2016/01/31/enhanced-source-file-handling-with-target_sources/

TLDR:

像这样在您的 src/ 目录中创建一个 CMakeLists.txt。

target_sources(foobar PRIVATE
   engine.cpp
   engine.h
)

并确保调用 add_subdirectory(src) 来处理新的 CMakeLists.txt

如果您对为什么构建系统中的 globbing 通常很糟糕感兴趣。我可以提供链接。