首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用调试后缀(_d)引导cmake链接到共享对象

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

Stack Overflow用户
提问于 2017-04-11 10:12:38
回答 2查看 1.1K关注 0票数 1

我有一个很像这样的cmake项目:

代码语言:javascript
复制
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.solibTransmogrifier_d.so都存在。

问题是,当前项目似乎是针对没有后缀的静态_d库进行链接,并抱怨:

代码语言:javascript
复制
/usr/bin/ld: cannot find -lContinuumTransfunctioner
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-12 09:49:56

这是解决方案,感谢cmake邮件列表上的好人

代码语言:javascript
复制
# 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>
)
票数 1
EN

Stack Overflow用户

发布于 2017-04-11 10:32:02

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

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

您可能要做的是传递一个库目标名。这将触发一个更聪明的依赖处理,并解决您的问题。但是,只有当库是target_link_libraries调用上下文中的已知目标时,这才有效。您可以轻松地检查以下内容:

代码语言:javascript
复制
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的包装机构自动生成库的构建过程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43343005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档