我正在做一个跨平台的项目,它有一些手写的汇编,以优化各种CPU架构的性能。我正在将这个项目从一个专有的构建系统转换为CMake,首先使用Windows上的Visual Studio进行编译。对于x86和AMD64,我已经能够很好地组装和链接所有东西,但我不能让它在ARM64 (或者可能是ARM32,尽管我还没有尝试过)上工作。
我将ASM文件包含在我的源代码中,如下所示:
if(CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64")
list(APPEND SOURCES
amd64/aesasm.asm
...)
set_source_files_properties(
amd64/aesasm.asm
...
PROPERTY LANGUAGE ASM_MASM)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "X86")
# ...
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64")
list(APPEND SOURCES
arm64/fdef_asm.asm
...)
set_source_files_properties(
arm64/fdef_asm.asm
...
PROPERTY LANGUAGE ASM_MASM)然后,在我的顶级CMakeLists.txt中,我使用enable_language(ASM_MASM)启用了MASM。对于x86和AMD64,CMake会自动找到ml/ml64.exe,正确配置Visual Studio项目,一切都会正常工作。
但是对于ARM64,如果我尝试同样的事情,当我尝试构建时,我从Visual Studio得到这个错误:MSB3721: The command "echo MASM not supported on this platform。据我所知,这是因为Visual Studio认为ARM程序集是一种不同的方言"MARMASM",汇编程序具有不同的可执行文件名(armasm/armasm64.exe)。
我尝试在我的ARM64工具链文件中设置enable_language(ASM_MARMASM),但CMake没有将其识别为ASM方言,并给出以下错误:
CMake Error: Could not find cmake module file: CMakeDetermineASM_MARMASMCompiler.cmake
CMake Error: Could not find cmake module file: F:/os/src/symcrypt/bin/CMakeFiles/3.15.3/CMakeASM_MARMASMCompiler.cmake
CMake Error at CMakeLists.txt:49 (enable_language):
No CMAKE_ASM_MARMASM_COMPILER could be found.我还尝试了手动设置汇编程序:
get_filename_component(VS_TOOLS_DIRECTORY ${CMAKE_LINKER} DIRECTORY)
find_file(ARM64_COMPILER "armasm64.exe" HINTS ${VS_TOOLS_DIRECTORY})
set(CMAKE_ASM_MARMASM_COMPILER ${ARM64_COMPILER})
enable_language(ASM_MARMASM)
message(STATUS "Manually set assembler to ${CMAKE_ASM_MARMASM_COMPILER}")但这也不起作用;我仍然收到一个错误,即No CMAKE_ASM_MARMASM_COMPILER could be found.
如何在我的项目中包含ARM/ARM64程序集?
发布于 2020-12-21 23:44:51
看起来CMake (仍然)不支持这一点。我在.NET源代码中找到了一些可以解决这个问题的方法:
和
编辑:作为参考,下面是我对一个项目的提交:https://dyncall.org/pub/dyncall/dyncall/rev/451299d50c1a
https://stackoverflow.com/questions/59742466
复制相似问题