加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 如何使用CMake获取多配置生成器和基于makefile的目标

发布时间:2020-12-14 02:46:59 所属栏目:Windows 来源:网络整理
导读:我想基于动态方式的目标文件中的所有符号生成 module definition file(想想 GTKMM的 gendef). 为此,我想 add_custom_command 为PRE_LINK步骤的目标.但是,看起来没有简单的方法可以使用CMake获取所有目标文件的路径,这些文件适用于普通的makefile以及Visual S
我想基于动态方式的目标文件中的所有符号生成 module definition file(想想 GTKMM的 gendef).

为此,我想add_custom_command为PRE_LINK步骤的目标.但是,看起来没有简单的方法可以使用CMake获取所有目标文件的路径,这些文件适用于普通的makefile以及Visual Studio等多配置生成器.

现在,我有以下内容

add_custom_command(TARGET tgt PRE_LINK
COMMAND gendef ${CMAKE_CURRENT_BINARY_DIR}/tgt.def $<TARGET_FILE_NAME:tgt> ${CMAKE_CURRENT_BINARY_DIR}/$<$<BOOL:${CMAKE_BUILD_TYPE}>:${CMAKE_FILES_DIRECTORY}>/tgt.dir/${CMAKE_CFG_INTDIR}/*.obj
)

然而,这是非常笨拙和笨重的,因为我不得不在我看来使用generator expression.有没有更好的方法来实现这种效果,即为每个构建配置调用某个外部程序?

它是一个CMake错误(功能?),对于普通的makefile,所有目标文件都转到CMakeFiles / tgt.dir文件夹,而对于多配置生成器,所有文件都转到CMakeFiles的兄弟,即tgt.dir / $< CONFIG>?我是否错过了一些简单的变量,可以直接指向正确的位置?

解决方法

将我的评论转化为答案

由CMake生成的Makefile项目具有完全不同的内部结构,然后为Visual Studio生成解决方案/项目.我认为这既不是错误也不是特征,这些结构只针对其用例进行了优化.

据我所知,没有简单的CMake内部方法来获取目标文件列表或中间文件目录的路径,例如:阅读目标财产.

所以我已经采用了您的代码示例,并使用Visual Studio 14 2015和NMake Makefiles生成器对CMake 3.3.2进行了一些替代测试.

备择方案

>关于名为“CMake: Is there an elegant way to get list of object files participating into a library?”的CMake邮件列表的一个相关讨论建议使用中间静态库:

add_library(tgtlib STATIC tgt.c)
add_custom_command(
    OUTPUT tgt.def
    COMMAND gendef tgt.def $<TARGET_FILE_NAME:tgt> $<TARGET_FILE:tgtLib> 
)
file(WRITE dummy.c "")
add_library(tgt SHARED dummy.c tgt.def)
target_link_libraries(tgt tgtlib)

>您可以在PRE_LINK步骤中添加特定于构建环境的元素:

if(CMAKE_CONFIGURATION_TYPES)
    set(_obj_files "$(IntermediateOutputPath)*.obj")
else()
    set(_obj_files "$?")
endif()
add_custom_command(
    TARGET MainProject 
    PRE_LINK
    COMMAND gendef tgt.def $<TARGET_FILE_NAME:tgt> ${_obj_files}
)

参考

> NMAKE: Filename Macros

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读