Android 使用CMake内置NDK构建Verilator(C+;+;)

Android 使用CMake内置NDK构建Verilator(C+;+;),android,c++,cmake,android-ndk,verilator,Android,C++,Cmake,Android Ndk,Verilator,我举了个例子,但什么也没发生: cmake_minimum_required(VERSION 3.8) project(cmake_simulator) set(CMAKE_SYSTEM_NAME Android) set(CMAKE_SYSTEM_VERSION 21) set(CMAKE_ANDROID_ARCH_ABI x86) set(CMAKE_ANDROID_NDK /home/icarolima/Android/Sdk/ndk/21.3.6528147) set(CMAKE_AN

我举了个例子,但什么也没发生:

cmake_minimum_required(VERSION 3.8)
project(cmake_simulator)

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21)
set(CMAKE_ANDROID_ARCH_ABI x86)
set(CMAKE_ANDROID_NDK /home/icarolima/Android/Sdk/ndk/21.3.6528147)
set(CMAKE_ANDROID_STL_TYPE gnustl_static)

set(CMAKE_TOOLCHAIN_FILE /home/icarolima/Android/Sdk/ndk/21.3.6528147/build/cmake/android.toolchain.cmake)

find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
if (NOT verilator_FOUND)
  message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
endif()

# Create a new executable target that will contain all your sources
add_library(simulator SHARED simulator.cpp)

# Add the Verilated circuit to the target
verilate(simulator
  INCLUDE_DIRS "."
  SOURCES top.sv
  VERILATOR_ARGS -Wno-CASEINCOMPLETE -Wno-WIDTH -Wno-COMBDLY -cc +1800-2012ext+sv)
例如,如果我将
CMAKE\u ANDROID\u ARCH\u ABI
更改为其他任何内容,则不会发生任何事情。这就像CMake忽略了代码的NDK部分一样

但如果我将项目更改到另一个位置,则会发生不同的情况:

cmake_minimum_required(VERSION 3.8)

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21)
set(CMAKE_ANDROID_ARCH_ABI x86)
set(CMAKE_ANDROID_NDK /home/icarolima/Android/Sdk/ndk/21.3.6528147)
set(CMAKE_ANDROID_STL_TYPE gnustl_static)

project(cmake_simulator)

set(CMAKE_TOOLCHAIN_FILE /home/icarolima/Android/Sdk/ndk/21.3.6528147/build/cmake/android.toolchain.cmake)

find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
if (NOT verilator_FOUND)
  message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
endif()

# Create a new executable target that will contain all your sources
add_library(simulator SHARED simulator.cpp)

# Add the Verilated circuit to the target
verilate(simulator
  INCLUDE_DIRS "."
  SOURCES top.sv
  VERILATOR_ARGS -Wno-CASEINCOMPLETE -Wno-WIDTH -Wno-COMBDLY -cc +1800-2012ext+sv)
错误:

CMake Error at /home/icarolima/Android/Sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler-NDK.cmake:97 (message):
  Android: No toolchain for ABI 'x86' found in the NDK:

    /home/icarolima/Android/Sdk/ndk/21.3.6528147

我没有使用CMake的经验,我认为问题在于事情的顺序。有人能帮我吗?

设置所有这些变量(如
CMAKE\u系统名称
CMAKE\u系统版本
CMAKE\u ANDROID\u ARCH\u ABI
等)都应该在工具链文件中进行。通过将这些文件放入
CMakeLists.txt
文件本身,您肯定会遇到一些恶劣的CMake行为。在您链接的CMake文档中甚至有一个示例工具链文件

此外,调用
cmake
时,应在命令行上设置变量,而不是在cmake文件本身中。这会将
CMakeLists.txt
文件缩减为如下内容:

cmake_minimum_required(VERSION 3.8)

project(cmake_simulator)
    
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
if (NOT verilator_FOUND)
  message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
endif()

# Create a new executable target that will contain all your sources
add_library(simulator SHARED simulator.cpp)

# Add the Verilated circuit to the target
verilate(simulator
  INCLUDE_DIRS "."
  SOURCES top.sv
  VERILATOR_ARGS -Wno-CASEINCOMPLETE -Wno-WIDTH -Wno-COMBDLY -cc +1800-2012ext+sv)
cmake -DCMAKE_TOOLCHAIN_FILE=/home/icarolima/Android/Sdk/ndk/21.3.6528147/build/cmake/android.toolchain.cmake ..
然后,您应该调用
cmake
,指定要使用的工具链文件,如下所示:

cmake_minimum_required(VERSION 3.8)

project(cmake_simulator)
    
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
if (NOT verilator_FOUND)
  message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
endif()

# Create a new executable target that will contain all your sources
add_library(simulator SHARED simulator.cpp)

# Add the Verilated circuit to the target
verilate(simulator
  INCLUDE_DIRS "."
  SOURCES top.sv
  VERILATOR_ARGS -Wno-CASEINCOMPLETE -Wno-WIDTH -Wno-COMBDLY -cc +1800-2012ext+sv)
cmake -DCMAKE_TOOLCHAIN_FILE=/home/icarolima/Android/Sdk/ndk/21.3.6528147/build/cmake/android.toolchain.cmake ..

所以,为了澄清,我解决它的方法可以在这里看到:,这里:


谢谢您的回答@squareskittles

因此,如果我想指定ABI,我可以做什么?另外,使用这些参数和这个CMakeLists.txt调用CMake会给我以下错误:
CMakeLists.txt处的CMake错误:27(消息):找不到Verilator。安装它,或者设置VERILATOR_ROOT环境变量
,但是如果我没有设置
CMAKE_TOOLCHAIN_文件
@carodantasderaújoLima,则不会发生此错误。正如我在回答中建议的那样,您应该在TOOLCHAIN文件中设置所有这些变量(例如
CMAKE_ANDROID_ARCH_ABI
)。此外,正如错误所说,您必须首先在您的机器上安装Verilator软件,确保它与您在CMake中使用的编译器/体系结构相匹配。我发现了发生的情况:我已经安装了Verilator,问题已被描述。我将标记您的答案为已接受,然后我将编辑我的问题,并提供完整的解决方案,多谢各位@ÍCarodantasderaújoLima很高兴它起作用了!如果您有一个更完整的解决方案,请考虑编写您自己的应答邮件来将完整的解决方案与您的问题分开。您也可以随时将您的标记为已接受!