我有一个看起来像这样的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
答案 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>
)