gpt4 book ai didi

windows - 如何使用 CMake 为多配置生成器和基于 makefile 的生成器获取目标文件的路径?

转载 作者:可可西里 更新时间:2023-11-01 13:46:42 25 4
gpt4 key购买 nike

我想生成一个 module definition file以动态方式基于目标文件中可用的所有符号(想想 GTKMMgendef )。

为此,我想 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在我看来。有没有更好的方法来实现这个效果,即为每个构建配置调用某个外部程序?

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

最佳答案

将我的评论变成答案

由 CMake 生成的 Makefile 项目与为 Visual Studio 生成的解决方案/项目具有完全不同的内部结构。我认为这既不是错误也不是功能,这些结构只是针对它们的用例进行了优化。

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

因此,我采用了您的代码示例,并使用 Visual Studio 14 2015NMake Makefiles 生成器对 CMake 3.3.2 的替代方案进行了一些测试。

备选方案

  1. 名为 "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)
  2. 您可以将特定于构建环境的元素添加到您的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}
    )

引用资料

关于windows - 如何使用 CMake 为多配置生成器和基于 makefile 的生成器获取目标文件的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29884856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com