使用 CMake/VS2019 从 conan 链接 spdlog 时库编译时间设置不匹配?
Library compile time settings mismatch when linking spdlog from conan using CMake/VS2019?
我正在尝试将 spdlog 1.9.0 添加到我的 CMake 项目中,对于这个项目,我正在为它使用 VS2019 的新的基于 CMake 的项目系统 building/running。当我使用非常简单的调用在我的实现中包含 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 built/deployed 使用一组 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_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 生成器。
我正在尝试将 spdlog 1.9.0 添加到我的 CMake 项目中,对于这个项目,我正在为它使用 VS2019 的新的基于 CMake 的项目系统 building/running。当我使用非常简单的调用在我的实现中包含 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 built/deployed 使用一组 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_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 生成器。