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很高兴它起作用了!如果您有一个更完整的解决方案,请考虑编写您自己的应答邮件来将完整的解决方案与您的问题分开。您也可以随时将您的标记为已接受!