在我的项目中,我使用的是protobuf 3.5。我至少需要调试和RelWithDebugInfo
配置。为了能够使用protobuf调试库构建项目,仅导致了一些问题:
我需要使用发行版和调试目标从源代码构建protobuf库,因为我的库(_ITERATOR_DEBUG_LEVEL
的{{1}}与protobuf库的级别({{ 1}})。构建调试库和发行版库之后,就可以在调试配置中进行编译。
现在,回到= 2
之后,我再次遇到相同的错误,但现在恰好相反:我的库的= 0
是RelWithDebugInfo
,并且使用的protobuf库的级别是_ITERATOR_DEBUG_LEVEL
。
在检查链接器配置时,我可以看到我的库是针对libprotobuf d .lib链接的。这是有道理的,因为我在某处读到,不是 0
的所有内容都将使用调试库(如果可用)。这导致了我的问题:
在开发过程中,我不会在2
中构建库。大多数情况下,Release
。但是此配置的Release
显然设置为RelWithDebugInfo
(因为它是具有附加信息的发布配置)。但是,CMake然后链接到与其余协议不兼容的protobuf调试库。
我现在正在寻找一种可能性,告诉CMake不要使用库的调试版本,而要使用发行版,而无需更改protobuf本身的CMake脚本。
通常,根据实际的构建配置,我的方法是转到link different libraries。但是不幸的是,protobuf CMake配置试图独自解决这个问题。
_ITERATOR_DEBUG_LEVEL
根据实际配置选择覆盖导入的目标:
protobuf-targets-release.cmake:
0
protobuf-targets-debug.cmake:
# Load information for each installed configuration.
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
file(GLOB CONFIG_FILES "${_DIR}/protobuf-targets-*.cmake")
foreach(f ${CONFIG_FILES})
include(${f})
endforeach()
而我的CMakeLists.txt中的链接看起来像这样:
# Import target "protobuf::libprotobuf-lite" for configuration "Release"
set_property(TARGET protobuf::libprotobuf-lite APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(protobuf::libprotobuf-lite PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libprotobuf-lite.lib"
)
我在这里看不到指定所需库的任何可能性。通常我会说我会这样指定它:
# Import target "protobuf::libprotobuf-lite" for configuration "Debug"
set_property(TARGET protobuf::libprotobuf-lite APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
set_target_properties(protobuf::libprotobuf-lite PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/lib/libprotobuf-lited.lib"
)
或为周围的不同构建配置包装一些精美的if条件。但是由于protobuf有效地覆盖了目标,所以我不知道如何为每个版本提取正确的库。
有什么想法吗?
答案 0 :(得分:1)
我现在正在寻找一种可能告诉CMake不要使用库的调试版本,而是使用发行版
变量CMAKE_MAP_IMPORTED_CONFIG_用于解决该问题:
# When build your project in RelWithDebugInfo configuration,
# try to use Release configuration of the *IMPORTED* libraries.
# If some IMPORTED library has no Release configuration, fallback to Debug one.
set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBUGINFO Release Debug)
# Imported targets set with given call will be aware of the variable's set above
find_package(Protobuf REQUIRED)
# Simply link with an IMPORTED library.
target_link_libraries(MyExe protobuf::libprotobuf)
如果您想仅使用特定导入库中的发布配置,而不能全部使用,则可以为这些特定设置相应的属性库:
# Firstly, create needed IMPORTED target.
find_package(Protobuf REQUIRED)
# Then adjust its properties.
# While the target is created by others, given property is specifically
# designed to be set in *your project*.
set_property(TARGET protobuf::libprotobuf PROPERTY MAP_IMPORTED_CONFIG_RELWITHDEBUGINFO Release Debug)
# Simply link with an IMPORTED library.
target_link_libraries(MyExe protobuf::libprotobuf)