CMake生成Makefile在macOS正常 Linux报无-Wunused-command-line-argument错误如何解决
问题根因
该报错由不同编译器的选项支持差异导致:-Wunused-command-line-argument是Clang专属的警告选项,你Ubuntu环境用的GCC 9.3版本并未提供该选项,因此传入-Wno-error=unused-command-line-argument时GCC会直接报不存在该选项的错误。
解决方案
可以用CMake内置的编译器选项检测能力,仅当编译器支持对应选项时才添加,不需要硬编码编译器分支,可同时兼容GCC、Clang等主流编译器。同时建议调整OpenMP参数的添加方式,从根源减少unused参数警告的产生。
修改后的CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.10) # 引入编译器选项检测模块 include(CheckCXXCompilerFlag) # set the project name and version project(PCA VERSION 0.1 DESCRIPTION "framework for building Cellular Automata" LANGUAGES CXX) # specify the C++ standard set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) find_package(OpenMP REQUIRED) # compile options if (MSVC) # warning level 4 and all warnings as errors add_compile_options(/W4 /WX) # speed optimization add_compile_options(/Ox) else() # 通用警告选项,GCC和Clang都支持 add_compile_options(-Wall -Wextra -pedantic -Werror) add_compile_options(-g -O3) # 检测编译器是否支持unused-command-line-argument的忽略错误配置,支持才添加 check_cxx_compiler_flag(-Wno-error=unused-command-line-argument SUPPORT_NO_ERROR_UNUSED_CLI_ARG) if(SUPPORT_NO_ERROR_UNUSED_CLI_ARG) add_compile_options(-Wno-error=unused-command-line-argument) endif() endif() add_library(parallelcellularautomata STATIC <all the needed .cpp and .hpp files here> ) target_include_directories(parallelcellularautomata PUBLIC include) # 用CMake原生方式链接OpenMP,自动处理编译/链接参数,比全局加选项更合理 target_link_libraries(parallelcellularautomata PUBLIC OpenMP::OpenMP_CXX)
方案说明
check_cxx_compiler_flag会自动检测当前使用的C++编译器是否支持传入的选项,仅当支持时才会添加对应编译参数,完美兼容不同编译器的选项差异- 改为链接CMake提供的
OpenMP::OpenMP_CXX目标而非全局添加编译选项,CMake会自动处理参数传递,只有需要的编译单元会带上OpenMP参数,从根源减少unused command line argument警告的产生
内容的提问来源于stack exchange,提问作者Gerardo Zinno
相关产品推荐
相关产品推荐

