我正在使用标准命令构建一个可执行文件:
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"
)