我有一个很像这样的cmake项目:
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})其中,ContinuumTransfunctioner和Transmogrifier项目包括调试后缀指令SET(CMAKE_DEBUG_POSTFIX "_d"),因此libContinuumTransfunctioner_d.so和libTransmogrifier_d.so都存在。
问题是,当前项目似乎是针对没有后缀的静态_d库进行链接,并抱怨:
/usr/bin/ld: cannot find -lContinuumTransfunctioner发布于 2017-04-12 09:49:56
这是解决方案,感谢cmake邮件列表上的好人
# 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>
)发布于 2017-04-11 10:32:02
传入target_link_libraries调用的target_link_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运行的一部分构建的,那么只需确保相应的add_library调用是从执行target_link_libraries调用的文件通过add_subdirectory导入的子目录中执行的。
如果所讨论的库是外部依赖项,则需要构建一个包含所有相关信息的进口目标,以便在哪里找到库文件(包括任何潜在的调试后修复)。手工操作可能有点麻烦,因此如果可以,您可能希望使用CMake的包装机构自动生成库的构建过程。
https://stackoverflow.com/questions/43343005
复制相似问题