【问题标题】:Adding global compile flags in CMake在 CMake 中添加全局编译标志
【发布时间】:2019-03-11 19:26:43
【问题描述】:

我正在编辑其他人制作的 CMakeLists.txt 文件。我正在尝试消除编译项目时产生的一些警告。

通常我只需添加 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MY_FLAGS}") 和我需要添加的任何标志,它工作正常,但对于这个项目,它只是不工作。警告仍然出现。我尝试了几种替代方法,但没有任何效果。

可能导致问题的原因是什么?

cmake_minimum_required(VERSION 3.1)
project(PBS)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

option(LIBIGL_USE_STATIC_LIBRARY "Use libigl as static library" OFF)
option(LIBIGL_WITH_ANTTWEAKBAR       "Use AntTweakBar"    OFF)
option(LIBIGL_WITH_CGAL              "Use CGAL"           OFF)
option(LIBIGL_WITH_COMISO            "Use CoMiso"         OFF)
option(LIBIGL_WITH_CORK              "Use Cork"           OFF)
option(LIBIGL_WITH_EMBREE            "Use Embree"         OFF)
option(LIBIGL_WITH_LIM               "Use LIM"            OFF)
option(LIBIGL_WITH_MATLAB            "Use Matlab"         OFF)
option(LIBIGL_WITH_MOSEK             "Use MOSEK"          OFF)
option(LIBIGL_WITH_OPENGL            "Use OpenGL"         ON)
option(LIBIGL_WITH_OPENGL_GLFW       "Use GLFW"           ON)
option(LIBIGL_WITH_OPENGL_GLFW_IMGUI "Use ImGui"          ON)
option(LIBIGL_WITH_PNG               "Use PNG"            OFF)
option(LIBIGL_WITH_PYTHON            "Use Python"         OFF)
option(LIBIGL_WITH_TETGEN            "Use Tetgen"         OFF)
option(LIBIGL_WITH_TRIANGLE          "Use Triangle"       OFF)
option(LIBIGL_WITH_VIEWER            "Use OpenGL viewer"  ON)
option(LIBIGL_WITH_XML               "Use XML"            OFF)

if (NOT LIBIGL_FOUND)
    find_package(LIBIGL REQUIRED QUIET)
endif()

add_subdirectory(0_dummy)
add_subdirectory(1_cannonball)
add_subdirectory(2_spring)
add_subdirectory(3_spinning)
add_subdirectory(4_gyro)


# Custom commands
set( CMAKE_EXPORT_COMPILE_COMMANDS ON )
add_compile_options ( -Wno-reorder )
add_definitions ( -Wno-unknown-pragmas )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sign-compare")

编辑: 我发现在其中一个子目录中添加标志适用于该子目录(例如在3_spinning/CMakeLists.txt 中)。有没有办法全局设置标志?

【问题讨论】:

  • 您正在尝试设置 3 个不同的编译器标志。哪个确切设置不起作用? (也就是说,您想要设置哪些标志来抑制警告?)
  • @Tsyvarev 所有三个。我正在尝试替代方法并设置不同的标志来查看哪个有效,但它们都不起作用。最后,我会添加所有三个。
  • 好的,但是你写“我发现在其中一个子目录中添加标志适用于该子目录” - 在子目录中使用时设置标志的方式有效 ?
  • @Tsyvarev 我相信这三种方法都有效

标签: c++ cmake compilation


【解决方案1】:

您在最后添加标志,扫描子文件夹后,您必须先设置标志,然后浏览您的子文件夹。

【讨论】:

  • 这适用于使用相应命令添加标志时,如add_compile_optionsadd_definitions。但是设置CMAKE_CXX_FLAGS 会影响所有目标,无论设置在哪里。
  • 确实...在这种情况下,缺少哪些警告?是 -Wno-sign-compare 还是 -Wno-order 或两者兼而有之?
  • 好问题.. 但最好向提问者提出:)
  • 正如@Tsyvarev 所说,设置CMAKE_CXX_FLAGS 无论如何都应该起作用,但它不是......没有设置任何标志。我发现的唯一方法是分别在每个子文件夹中设置标志。
  • @Tsyvarev 这就是我刚刚尝试过的。在包含之前设置CMAKE_CXX_FLAGS 是行不通的,但其他两个确实可以。
【解决方案2】:

结论:add_compile_optionsadd_definitions 作用于当前目录和所有包含的目录包含在命令之后的目录。然而,设置CMAKE_CXX_FLAGS 似乎只适用于当前目录。但是不知道为什么,因为正如评论者 Tsyvarev 所说,它应该与前两种方法具有相同的范围。

基本上,像这样移动线条:

[...]
# Custom commands
add_compile_options ( -Wno-reorder )
add_definitions ( -Wno-unknown-pragmas )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sign-compare")

add_subdirectory(0_dummy)
add_subdirectory(1_cannonball)
add_subdirectory(2_spring)
add_subdirectory(3_spinning)
add_subdirectory(4_gyro)

我不再收到-Wreorder-Wunknown-pragmas 警告,但我仍然收到-Wsign-compare 警告。

【讨论】:

  • 有趣。我想我当时有很好的直觉。我认为它与 add_compile_option 和其他函数到达之前的旧 cmake 行为有关。当时,设置宏会影响当前文件夹中的所有目标,但如果在之后定义,则不会影响子目录。我还假设使用函数比现代 cmake 中的宏更受欢迎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多