【问题标题】:How do I pass gcc optimization level to cmake targets?如何将 gcc 优化级别传递给 cmake 目标?
【发布时间】:2017-03-11 20:32:20
【问题描述】:

我有一个 C 项目,它使用 CMake 为每种库类型(静态、动态和共享)构建三个目标:

add_library(contact-static STATIC EXCLUDE_FROM_ALL lib/contact.c)
add_library(contact-shared SHARED EXCLUDE_FROM_ALL lib/contact.c)

add_executable(contactbook src/main.c)
target_link_libraries(contactbook contact-static)

add_executable(contactbook-static EXCLUDE_FROM_ALL src/main.c)
target_link_libraries(contactbook-static contact-static)
add_dependencies(contactbook-static contact-static)

add_executable(contactbook-shared EXCLUDE_FROM_ALL src/main.c)
add_dependencies(contactbook-shared contact-shared)
target_link_libraries(contactbook-shared contact-shared)

add_executable(contactbook-dynamic EXCLUDE_FROM_ALL src/main.c)
target_link_libraries(contactbook-dynamic contact-shared)
target_compile_definitions(contactbook-dynamic PRIVATE DYNLIB=true)
target_compile_options(contactbook-dynamic PRIVATE -rdynamic)
target_link_libraries(contactbook-dynamic dl)

问题是我必须提供优化级别传递给make 命令。

我已经尝试过(但我都卡住了):

  • 通过像make -Dopt:STRING=0 这样的make comman 传递变量,但我不知道如何将其用作编译器标志
  • 为每个优化级别创建目标,但我无法将定义添加到 add_custom_target 目标

那么我该怎么做?将优化级别传递给 cmake 目标的最佳实践是什么?

【问题讨论】:

  • set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O9") 有什么问题?这可能不是最好的方式,但它(希望;我一直在我的 CMakeLists 中做这种事情)有效。
  • 因为我需要多个优化级别构建 (O0,O1...Os) 来比较它们,而且我不知道如何在不为每个级别创建目标的情况下做到这一点。
  • 每个不同的优化级别都是一个单独的构建配置。因此,您可能应该在唯一的构建目录中单独配置每个,传递特定于工具链的优化标志,如@at-2500 的答案所示。

标签: c gcc makefile cmake


【解决方案1】:

您可以在命令行上运行 cmake 时更改任何 cmake 变量,如下所示:

cmake -DCMAKE_CXX_FLAGS="-Os" .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多