【问题标题】:CMake object files of executable in custom commandCMake自定义命令中可执行的目标文件
【发布时间】:2019-11-21 20:07:59
【问题描述】:

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

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

【问题讨论】:

    标签: cmake cmake-custom-command


    【解决方案1】:

    每次我尝试访问可执行文件目标的一些生成器表达式并传递它时,CMake 都会因为循环依赖而崩溃

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

    add_library(obj OBJECT ${...})
    
    add_executable(exe $<TARGET_OBJECTS:obj>)
    

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

    【讨论】:

    • 谢谢,我没有考虑创建一个额外的对象库。如果不需要它仍然会更喜欢,但它现在可以使用。
    • 很高兴能帮上忙。不幸的是(在您的情况下)在 CMake 中鼓励您使用目标并使用它们来表达关系,而不是生成的文件。此外,虽然在后台有编译和链接阶段,但我不知道有一种方法可以在 CMake 中将它们分开以允许您在没有中间 OBJECT 库的情况下进行操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多