【问题标题】:Library compile time settings mismatch when linking spdlog from conan using CMake/VS2019?使用 CMake/VS2019 从柯南链接 spdlog 时库编译时间设置不匹配?
【发布时间】:2021-07-24 07:49:54
【问题描述】:

我正在尝试将 spdlog 1.9.0 添加到我的 CMake 项目中,对于这个项目,我正在使用 VS2019 新的基于 CMake 的项目系统来构建/运行它。当我使用非常简单的调用将 spdlog 包含在我的实现中时,我在尝试构建时遇到链接器错误。

#include <spdlog/spdlog.h>

App::App() :
    m_win(0) {
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        spdlog::error("Failed to initialize SDL");
    }
}

链接器错误如下:

Error   LNK2038 mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in App.cpp.obj 
Error   LNK2038 mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in App.cpp.obj 

错误会重复几次(准确地说是 4 次)。

似乎 spdlog 是使用一组 RuntimeLibrary 设置构建/部署到柯南的存储库的,而我使用的是不同的设置?对此我有什么办法吗?

以下是关于我的设置的更多数据:

conanfile.txt

[requires]
sdl/2.0.14
spdlog/1.9.0

[generators]
cmake

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)

project(my_project)

include(conanbuildinfo.cmake)
conan_basic_setup()

file(GLOB source_files
    "src/App.h"
    "src/App.cpp"
)

add_executable (${PROJECT_NAME} ${source_files})

# Compilers don't understand the different standards so
# we need to set them ourselves in various cases.
if(MSVC)
    add_compile_options("/std:c++17")
    set_property(TARGET ${PROJECT_NAME}
        PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()

conan_target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS})

【问题讨论】:

  • 当您执行conan install 安装依赖项时,您将看到用于安装二进制文件的“配置文件”,包括build_typecompiler.version 等设置。这应该与配置匹配您用于构建,如果构建用于调试,您应该使用类似conan install . -s build_type=Debug 的东西。对于 Visual Studio 多配置,您可以使用更现代的生成器,例如 CMakeDeps
  • 这就是问题所在!我按照您的描述更改了构建类型,它编译得很好。谢谢!
  • 好的,好的,那我把评论作为答案发表:)

标签: c++ static-linking conan spdlog


【解决方案1】:

当您执行conan install 安装依赖项时,您将看到用于安装二进制文件的“配置文件”,包括诸如 build_type、compiler.version 等设置,如下所示:

配置:

[settings]
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=Visual Studio
compiler.runtime=MD
compiler.version=16
os=Windows
os_build=Windows

这应该与您用于构建的配置相匹配,如果构建用于调试,您应该使用类似

conan install . -s build_type=Debug

也可以定义更多的配置文件(这是推荐的生产方法)。

重要的是当conan install conan 将使用提供的或默认的配置文件来定义将下载哪些二进制文件(如果该配置存在匹配的二进制文件)。提供稍后用于构建项目的相同配置非常重要,否则可能会发生上述二进制不兼容问题(或其他更微妙的不兼容问题,也可能在运行时发生)。

附带说明,对于 Visual Studio 多配置,您可以使用更现代的生成器,例如 CMakeDeps

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多