如何表示映射文件依赖于add_executable



我正在使用标准命令构建一个可执行文件:

add_executable(MyExe a.c b.c)

我正在调整CMAKE_EXE_LINKER_FLAGS以发出地图文件,并且它有效。

如果我删除映射文件,但是,执行增量构建不会重新生成映射文件。这是有道理的,因为我没有表示,地图文件依赖于MyExe。在上面的场景中,MyExe。Map甚至不是目标,所以cmake甚至不知道它的存在。

我已经尝试创建一个自定义目标,但我不能创建一个自定义命令,重新生成地图文件,因为它来自add_executable()。然后我尝试使用add_dependencies(),但这似乎只影响构建顺序。

我可以显式地将链接器作为构建自定义目标的自定义命令重新运行,但这似乎很浪费,因为链接确实需要花费一些时间。

似乎我需要某种方式来告诉add_executable有更多的输出,而不仅仅是可执行映像。有办法做到这一点吗?

如果有人能给我指出正确的方向,我会很感激的!

我在CMake的邮件列表中也看到过同样的问题,但从未收到过答案。让我试着在这里回答这个问题。

CMake没有对map文件的官方支持,如果你手动添加必要的链接器标志,也不支持一个可执行目标的多个输出。

如果你不想添加它作为一个额外的自定义命令/目标步骤,你可以链接到一个目标文件作为你的OBJECT_OUTPUTS源文件属性的可执行文件的一部分(不幸的是只适用于Makefile生成器)。

我已经用GNU工具链成功地测试了以下示例:

cmake_minimum_required(VERSION 2.6)
project(MapFileDep)
file(WRITE "main.cpp" "int main() { return 0; }")
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    set(
        CMAKE_EXE_LINKER_FLAGS 
        "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=output.map"
    )
endif()
add_executable(${PROJECT_NAME} "main.cpp")
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    set_source_files_properties(
        "main.cpp" 
        PROPERTIES OBJECT_OUTPUTS "output.map"
    )
endif()

这里是更高级的选择(也涵盖了@jww的用例):

添加生成/创建/复制output.map文件(当它不存在时)的东西,并使用LINK_DEPENDS目标属性使CMake意识到当output.map更改时重新链接:

add_custom_command(
    OUTPUT "output.map"
    COMMAND "${CMAKE_COMMAND}" -E touch "output.map"
)
add_executable(${PROJECT_NAME} "main.cpp" "output.map")
set_target_properties(
    ${PROJECT_NAME} 
    PROPERTIES 
        LINK_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/output.map"
)

相关内容

  • 没有找到相关文章

最新更新