使用调试后缀指导cmake链接共享对象(_d)

时间:2017-04-11 10:12:38

标签: cmake

我有一个看起来像这样的cmake项目:

OR

ContinuumTransfunctioner和Transmogrifier项目包含调试后缀指令cmake_minimum_required(VERSION 3.0) SET(CMAKE_DEBUG_POSTFIX "_d") include_directories(../TransfunctionerProject) include_directories(../TransmogrifierProject) set(Libraries ContinuumTransfunctioner Transmogrifier ) set(SourceFiles Wrapper.cpp Logger.cpp ) add_library(Frobnigator SHARED ${SourceFiles}) add_library(FrobnigatorStatic STATIC ${SourceFiles}) set_target_properties(FrobnigatorStatic PROPERTIES OUTPUT_NAME Frobnigator) target_link_libraries(Frobnigator ${Libraries}) ,以便SET(CMAKE_DEBUG_POSTFIX "_d")libContinuumTransfunctioner_d.so都存在。

问题是当前项目似乎是在没有_d后缀的情况下链接到 静态 库并抱怨:

libTransmogrifier_d.so

2 个答案:

答案 0 :(得分:1)

您传递到target_link_libraries调用的Libraries被解释为文件名,而不是目标名称。

这是CMake中该调用的不幸后备:如果你传递一个随机字符串,无法以有意义的方式解释,CMake将始终认为它是普通库名。有时这正是您想要的,但名称必须与现有库完全匹配。整个调试后缀魔法将在这里丢失。

您可能想要做的是传递库目标名称。这将触发更加智能的依赖性处理,并将解决您的问题。但是,只有在target_link_libraries调用的上下文中库是已知目标时才有效。您可以按如下方式轻松检查:

if(TARGET ContinuumTransfunctioner)
    message("Library target name")
else()
    message("Plain library name")
endif()
target_link_libraries(Frobnigator ContinuumTransfunctioner)

那么你如何得到目标名称案例?这取决于构建的结构。如果库是作为CMake运行的一部分构建的,只需确保从执行{{1}的文件中通过add_library引入的子目录执行相应的add_subdirectory调用。打电话。

如果相关库是外部依赖项,则需要构建一个imported target,其中包含查找库文件的所有相关信息(包括任何可能的调试后缀)。手动操作可能有点麻烦,因此如果可以,您可能希望使用CMake packaging mechanism自动生成此库,作为库构建过程的一部分。

答案 1 :(得分:1)

这是解决方案,由cmake mailing list上的好人提供:

# Note:
#    $<$<CONFIG:Debug>:_d> is called a generator expression.
#    It outputs _d if the build is debug.
#
set(Libraries
    ContinuumTransfunctioner$<$<CONFIG:Debug>:_d>
    Transmogrifier$<$<CONFIG:Debug>:_d>
)