1

我有一个在预链接阶段执行的自定义命令。我想要做的是计算将成为我的可执行文件一部分的所有部分的校验和。然后我想将此校验和作为全局变量链接到我的可执行文件中。

到目前为止,我可以计算将链接到我的可执行文件的所有库的校验和。但是我还需要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 由于循环依赖关系而崩溃(这对于输出可执行文件是正确的,但对于目标文件则不然,因为它们已经存在于预链接阶段)。

4

1 回答 1

1

每次我尝试访问 executable_target 的一些生成器表达式并传递它时,CMake 由于循环依赖而崩溃

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

add_library(obj OBJECT ${...})

add_executable(exe $<TARGET_OBJECTS:obj>)

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

于 2019-11-21T12:07:59.297 回答