【问题标题】:Unresolved External Symbol LNK2019 CMake未解析的外部符号 LNK2019 CMake
【发布时间】:2022-01-06 14:58:32
【问题描述】:

我在这里有一个名为 engine 的类,我正在尝试使用,但是当我包含它时,我得到 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
)```

【问题讨论】:

标签: c++ cmake


【解决方案1】:

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


不建议像您在这里所做的那样全局化您的源文件。

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

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

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

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

如果您对为什么在构建系统中通配通常不好的原因感兴趣。我可以提供链接。

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 2013-06-01
    • 1970-01-01
    • 2014-09-19
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2012-10-31
    相关资源
    最近更新 更多