【问题标题】:how cmake Error in compiling for riscv64-unknown-elf-g++为 riscv64-unknown-elf-g++ 编译 cmake 时如何出错
【发布时间】:2020-10-25 23:04:35
【问题描述】:

当我从终端 cmake .. 时,错误如下所示:

(base) k:~ cd /Users/yuli/Documents/version3/cpp/
(base) k:~ ls
CMakeLists.txt      src
riscv-gnu-toolchain test
(base) k:~ mkdir build
(base) k:~ cd build
(base) k:~ cmake ..
-- The C compiler identification is AppleClang 11.0.3.11030032
-- The CXX compiler identification is AppleClang 11.0.3.11030032
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
RegularExpression::compile(): Nested *?+.
RegularExpression::compile(): Error in compile.
CMake Error at CMakeLists.txt:10 (if):
  if given arguments:

    "/Library/Developer/CommandLineTools/usr/bin/c++" "MATCHES" ".*riscv64-unknown-elf-g++"

  Regular expression ".*riscv64-unknown-elf-g++" cannot compile


-- Configuring incomplete, errors occurred!
See also "/Users/yuli/Documents/version3/cpp/build/CMakeFiles/CMakeOutput.log".

我尝试了“STREQUAL”而不是 MATCHES,但没有奏效。知道这里可能出了什么问题吗?

CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.13)
project(ofdmchain)

set(CMAKE_CXX_FLAGS "-std=c++14")

add_definitions(-DCOMPILES_ON_PC -Wall -Wextra)

configure_file(${CMAKE_SOURCE_DIR}/src/config.hpp.in ${CMAKE_BINARY_DIR}/config.hpp)

if("${CMAKE_CXX_COMPILER}" MATCHES ".*riscv64-unknown-elf-g++")
  message(STATUS "Compiling RISCV")
  SET(RISCV 1)
else()
  message(STATUS "Compiling X86")
  SET(RISCV 0)
endif()

add_library(ofdm
  src/transmitter.cpp
  src/configuration.cpp

  src/ofdm.hpp
  src/datatypes.hpp
  )
target_include_directories(ofdm PRIVATE ${CMAKE_SOURCE_DIR}/../reference_matlab)
target_include_directories(ofdm PRIVATE ${CMAKE_SOURCE_DIR}/src/)

if (NOT ${RISCV})
  add_executable(unit_tests
    test/catch_main.cpp
    test/test_sanity.cpp
    test/test_utilities.cpp
    test/test_transmitter.cpp
    )
  target_include_directories(unit_tests PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
  target_include_directories(unit_tests PUBLIC ${CMAKE_SOURCE_DIR}/src)
  target_link_libraries(unit_tests ofdm)
endif()

我还尝试在 g++ 退出的地方以及 - where - 存在的地方添加 ++。并且也厌倦了“STREQUAL”而不是“MATCHES”,它也不起作用。可能是PATH中c++的问题?

【问题讨论】:

  • 能否请您添加有问题的 CMakeLists 段?从错误消息中猜测,您到底想做什么。
  • \+\+ 和 \- 我的意思是。

标签: cmake cmake-format


【解决方案1】:

CMake“内部错误”

RegularExpression::compile(): Nested *?+.

大约是最后两个+ 字符:在正则表达式中,这些字符具有特殊含义。

使+ 字符(和其他特殊字符)被处理字面意思的方法:

  1. 转义使用\ 的字符。注意,转义字符本身应该在CMake字符串中转义,所以你需要写它两次

    if("${CMAKE_CXX_COMPILER}" MATCHES ".*riscv64-unknown-elf-g\\+\\+")
    
  2. 将字符放入方括号 ([])。在[] 内部,所有特殊字符都失去了它们的特殊含义:

    if("${CMAKE_CXX_COMPILER}" MATCHES ".*riscv64-unknown-elf-g[+][+]")
    

还要注意,在某些if 条件下,不需要显式取消引用该变量:CMake 自己会这样做。

所以,可以写

if(CMAKE_CXX_COMPILER MATCHES ".*riscv64-unknown-elf-g[+][+]")

documentationif 命令中查看更多信息。

【讨论】:

  • 如果我执行上述操作,则根本没有检测到 riscv64 编译器。它直接跳到其他条件。我尝试了上面提到的一切。
  • 如果编译器是foo-riscv64-unknown-elf-g++,它适用于我。你用的是哪个编译器,所以和正则表达式不匹配?
  • (base) k:~ riscv64-unknown-elf-g++ --version riscv64-unknown-elf-g++ (GCC) 9.2.0 版权所有 (C) 2019 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不是为了适销性或适合特定目的。
  • riscv64-unknown-elf-g++ 也适合我,例如使用[+] 的第二种方法。你确定 CMAKE_CXX_COMPILER 变量被赋予了这个值吗?您可以使用message 命令打印变量的值。
  • 坦率地说,我是 Linux 新手,目前只是使用 riscv64 编译器为项目编译 cpp 代码。但我无法成功编译代码。但是当我尝试这个 echo $CMAKE_CXX_COMPILER 时,输出什么都没有。
猜你喜欢
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2012-09-10
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多