android - 使用 CMake 内置 NDK 构建 Verilator (C++)
问题描述
我尝试了这个例子,但没有任何反应:
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_ANDROID_ARCH_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_SYSTEM_NAME
、CMAKE_SYSTEM_VERSION
、CMAKE_ANDROID_ARCH_ABI
等)应该在工具链文件中进行。CMakeLists.txt
通过将这些放在文件本身中,您肯定会遇到一些令人讨厌的 CMake 行为。您在此处链接的 CMake 文档中甚至还有一个示例工具链文件。
此外,当您调用时,应该在命令行CMAKE_TOOLCHAIN_FILE
上设置变量,而不是在 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
,指定要使用的工具链文件,如下所示:
cmake -DCMAKE_TOOLCHAIN_FILE=/home/icarolima/Android/Sdk/ndk/21.3.6528147/build/cmake/android.toolchain.cmake ..
推荐阅读
- ios - 如何在故事板之间传递数据
- c# - 使用 EF Core 自动创建数据库
- flutter - 有没有办法查询 WebView 是否可滚动?
- java - Azure Application Insights 无代码代理不在应用程序映射中显示 cloudRoleInstance 和 cloudRoleName
- c# - 使用 Blazor 调用 Twilio 语音 API
- c# - 当 catch 语句没有显式捕获异常对象时,它们是否更快/更便宜?
- git - 如何基于旧提交创建分支并使我的本地文件反映该提交?
- scala - throttleShape 的参数是什么意思?
- django - django 中的关系使用哪一个
- python - 打印一个字符串输出循环