将protobuf与CMake的不同构建配置一起使用(RelWithDebugInfo和Debug)

时间:2019-03-20 15:43:44

标签: cmake protocol-buffers

在我的项目中,我使用的是protobuf 3.5。我至少需要调试和RelWithDebugInfo配置。为了能够使用protobuf调试库构建项目,仅导致了一些问题:

我需要使用发行版和调试目标从源代码构建protobuf库,因为我的库(_ITERATOR_DEBUG_LEVEL的{​​{1}}与protobuf库的级别({{ 1}})。构建调试库和发行版库之后,就可以在调试配置中进行编译。

现在,回到= 2之后,我再次遇到相同的错误,但现在恰好相反:我的库的= 0RelWithDebugInfo,并且使用的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有效地覆盖了目标,所以我不知道如何为每个版本提取正确的库。

有什么想法吗?

1 个答案:

答案 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)