【问题标题】:How to get cmake generate -std=c++14 flag for qcc compiler如何为 qcc 编译器获取 cmake 生成 -std=c++14 标志
【发布时间】:2019-12-27 16:01:24
【问题描述】:

我正在尝试使用 cmake 为 QNX neutrino 交叉编译一些 c++ 库。在 CMakeLists.txt 文件中,我指定了 CMAKE_CXX_STANDARD 14 required,但生成的编译器命令行不包含 -std=c++14 选项。

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

我尝试过使用目标编译功能:

target_compile_features(my_library PRIVATE cxx_std_14)

但这给了我以下错误:

CMake Error at CMakeLists.txt:53 (target_compile_features):
    target_compile_features no known features for CXX compiler

    "QCC"

    version 5.4.0.

当我使用 check_cxx_compiler_flag 功能时,它似乎可以识别该选项:

include(CheckCXXCompilerFlag)
check_cxx_compiler_flag(-std=c++14 CXX14_SUPPORT)
if(CXX14_SUPPORT)
  message("c++14 support found")
else()
  message("c++14 unsupported")
endif()

这会输出消息

c++14 support found

手动运行 qcc 它接受 -std=c++14 选项就好了,使用 std::make_unique 的代码编译就好了。

还使用本机编译器(Ubuntu 18.04,gcc),cmake 生成的 makefile 一切正常。 make VERBOSE=1 显示以下命令行(我删除了一些目录):

/usr/local/bin/c++  -Dshm_transfer_EXPORTS -I...  -fPIC   -std=gnu++14 -o CMakeFiles/shm_transfer.dir/src/SharedMemoryTransfer.cpp.o -c .../SharedMemoryTransfer.cpp

相对于使用 qcc 工具链的命令行:

.../qnx700/host/linux/x86_64/usr/bin/qcc -lang-c++ -Vgcc_ntox86_64 -lang-c++ -Dshm_transfer_EXPORTS -I...  -fPIC   -o CMakeFiles/shm_transfer.dir/src/SharedMemoryTransfer.cpp.o -c .../SharedMemoryTransfer.cpp

我希望 cmake 命令能够识别 qcc 支持 -std=c++14 选项并由于 CMAKE_CXX_STANDARD 设置而生成相应的命令行。

【问题讨论】:

    标签: cmake c++14 qnx


    【解决方案1】:

    使用

    set_property(TARGET ${PROJECT_NAME} PROPERTY LINKER_LANGUAGE CXX)
    set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14)
    

    。使用它,您可以将编译器设置粘贴到目标,而不鼓励使用全局标志,并且可以被其他 cmake 使用者覆盖。这就是我认为已弃用的set(CMAKE_CXX_STANDARD 14) 对您没有帮助的原因:我看不到您的完整 CMakeLists.txt,并打赌您有许多子文件夹和其他目标,这可能会重置 CMAKE_CXX_STANDARD 他们自己。还要确保 CMake 命令的顺序。

    如果需要,您可以将${PROJECT_NAME} 替换为my_library

    【讨论】:

    • 虽然这是个好建议 - 它如何回答 OP 的问题?我相信不会。
    • @einpoklum 我添加了一些我认为它的提示。
    • 谢谢,@Superlokkus。这解决了问题。事实上,我希望将设置用于所有本地项目,即甚至独立于工具链并用于所有目标。你知道我是否可以在顶级cmake文件中使这个设置目标独立吗?
    • @joggerwolf 我几乎可以肯定设置 CMAKE_CXX_STANDARD 和其他 2 是你能做的最好的,但你不能确定,特别是因为依赖项可以手动添加编译器标志或通过使用预处理器指令。在我看来,这也是不可行的,依赖关系可以做太多坏事,你必须能够推动它们或修补它们。
    • @Superlokkus:对不起,我不得不重新打开它。当我尝试 set_property 时,似乎我仍然有手动设置 -std=gnu++14 的解决方法。现在,清理完所有内容并更新了所有 CMakeLists.txt,我又回到了起点:命令行不包含支持 c++ 14 的选项 :-(
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多