【问题标题】:Produce mapfile with CMAKE_CXX_FLAGS and MSVC14使用 CMAKE_CXX_FLAGS 和 MSVC14 生成地图文件
【发布时间】:2020-05-28 13:15:00
【问题描述】:

我正在尝试使用 CMake (Clion) 生成 Mapfile

cmake_minimum_required(VERSION 3.13)
project(cmake_testapp)
set(CMAKE_CXX_STANDARD 14)
MESSAGE("TEST_HELLO")
set(MSVC_COVERAGE_COMPILE_FLAGS "/Fm${PROJECT_SOURCE_DIR}/file.map")

set(CMAKE_CXX_FLAGS "${MSVC_COVERAGE_COMPILE_FLAGS} ${CMAKE_CXX_FLAGS}" )
MESSAGE(${CMAKE_CXX_FLAGS})
MESSAGE(${CMAKE_CXX_COMPILER})
add_executable(cmake_testapp loaderstack.cpp)

输出:

"C:\Program Files\JetBrains\CLion 2020.1.1\bin\cmake\win\bin\cmake.exe" -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - NMake Makefiles" C:\Users\remi\Desktop\OK
TEST_HELLO
/FmC:/Users/remi/Desktop/OK/file.map /DWIN32 /D_WINDOWS /W3 /GR /EHsc
C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.26.28801/bin/Hostx86/x86/cl.exe
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/remi/Desktop/OK/cmake-build-debug

[Finished]

但即使 CMAKE_CXX_FLAGS 包含标志,也不会生成 file.map。

【问题讨论】:

    标签: visual-c++ cmake clion


    【解决方案1】:

    映射文件由链接器生成,通常默认禁用。要启用映射文件的生成,必须提供 /MAP 链接器选项。当我使用/MAP 进行测试时,指定映射文件路径名的编译器标志/Fm 被忽略,并且生成的映射文件在二进制文件旁边具有默认名称。

    但是,您也可以通过将映射文件名附加到/MAP 链接器选项来指定它。在 CMake 中,您可以使用 target_link_options 为特定目标指定链接选项:

    cmake_minimum_required(VERSION 3.13)
    project(cmake_testapp)
    set(CMAKE_CXX_STANDARD 14)
    MESSAGE("TEST_HELLO")
    
    MESSAGE(${CMAKE_CXX_COMPILER})
    add_executable(cmake_testapp loaderstack.cpp)
    
    # Set the coverage flags for the cmake_testapp executable only.
    target_link_options(cmake_testapp PRIVATE "/MAP:${PROJECT_SOURCE_DIR}/file.map")
    

    【讨论】:

    • 感谢您的纠正。现在我正在尝试获取 g++ MinGw64 的 MAP 文件。我绝对不明白: set(CMAKE_CXX_LINKER_WRAPPER_FLAG "-Xlinker -Map=output.map") set(CMAKE_CXX_LINKER_WRAPPER_FLAG_SEP "-Map=output.map") 不起作用。 target_link_options(cmake_testapp PRIVATE "-Xlinker -Map=output.map") 不要工作太多 target_link_options(cmake_testapp PRIVATE "-Map") 不要工作 target_link_options(cmake_testapp PRIVATE "/MAP") 不要工作。我在谷歌上找不到简单的答案。索要地图文件是不是很奇特?再次感谢大家。
    • 适用于:set (CMAKE_EXE_LINKER_FLAGS "-Xlinker -Map=output.map" )
    • @MelectronVolt 为每个不同的编译器生成映射文件可能需要不同的选项。您的问题帖子特定于 VisualC++ 编译器。我对生成地图文件的 MinGW 选项不太熟悉。
    • 是的,但如何知道 Visual C++ 需要 target_link_options /MAP ?它是文档中的 /Fm。你在哪里可以找到这些信息,以便我下次可以找到自己?再次非常感谢。
    • @MelectronVolt 我刚刚查看了 Microsoft VisualC++ compiler options,特别是 /Fm 选项。 /Fm 的文档提到了 /MAP(在我的回复中链接),它可以完成相同的地图文件生成。
    猜你喜欢
    • 2023-03-20
    • 2013-07-29
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2023-01-17
    • 2017-01-11
    • 2015-06-23
    • 2022-06-22
    相关资源
    最近更新 更多