gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:37:35 24 4
gpt4 key购买 nike

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

add_executable(MyExe a.c b.c)

我正在调整 CMAKE_EXE_LINKER_FLAGS发出一个 map 文件,它的工作原理。

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

我尝试创建自定义目标,但无法创建重新生成 map 文件的自定义命令,因为它来自 add_executable() .然后我尝试使用 add_dependencies() ,但这似乎只影响构建顺序。

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

似乎我需要某种方式来告诉 add_executable 除了可执行镜像之外还有更多的输出。有没有办法做到这一点?

如果有人能指出我正确的方向,我将不胜感激!提前感谢您的阅读。

最佳答案

我看到在 CMake's mailing list 上也有人问过同样的问题并且从未得到答复。所以让我试着在这里回答它。

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"
)

关于cmake - 如何表示映射文件依赖于 add_executable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23573096/

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