自定义命令中可执行文件的CMake目标文件

CMake object files of executable in custom command

我有一个在 link 前阶段执行的自定义命令。 我想要做的是计算将成为我的可执行文件一部分的所有部分的校验和。然后我想 link link 这个校验和作为一个全局变量进入我的可执行文件。

到目前为止,我可以计算所有将 linked 到我的可执行文件中的库的校验和。但我还需要 exe 的已存在(因为它已经构建)目标文件的校验和。 有没有办法访问这个目标文件?

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/checksum.cpp 
    PRE_LINK
    COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/checksum_generator.cmake" ${LIB_DEPENDENCIES} <object_file_of_executable_target>
    DEPENDS ${LIB_DEPENDENCIES}
)

add_library(checksum STATIC ${CMAKE_CURRENT_BINARY_DIR}/checksum.cpp)
target_link_libraries(executable_target PUBLIC checksum)

所以我的问题是:如何获取可执行目标的目标文件?

每次我尝试访问 executable_target 的某些生成器表达式并传递它时,CMake 会因为循环依赖而崩溃(这对于输出可执行文件是正确的,但对于目标文件则不然,因为它们已经存在在前 link 阶段)。

Every time I try to access some generator expression of the executable_target and pass it, CMake crashes because of cyclic dependencies

我假设您首先将可执行文件构建为 OBJECT 库,然后在像这样使用它之后构建实际的可执行文件?

add_library(obj OBJECT ${...})

add_executable(exe $<TARGET_OBJECTS:obj>)

您是否在自定义命令中尝试过 $<TARGET_OBJECTS:obj> 生成器表达式?如果您的 checksum.cpp 仅在可执行目标(而不是对象库)中链接,那么这应该可以解决您的循环依赖。