【问题标题】:CMake how to set nasm file extenstionsCMake如何设置nasm文件扩展名
【发布时间】:2023-12-31 01:19:01
【问题描述】:

我正在尝试使用CMake 编译nasm 源文件,并且对后缀有一些误解。默认情况下CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS 的值是nasm;asm,所以我希望*.SCMake 识别为ASM_NASM 文件。设置

set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS "${CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS};S")

似乎不起作用。这是完整的CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(casm)
enable_language(ASM_NASM)
set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS "${CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS};S")
set(CMAKE_ASM_NASM_COMPILE_OPTIONS "${CMAKE_ASM_NASM_COMPILE_OPTIONS} -f elf64 -g")
add_executable(min main.c min.S)

打印以下错误:

CMake Error: CMake can not determine linker language for target: min
CMake Error: Cannot determine link language for target "min".

虽然只是将 min.S 重命名为 min.asm 并将添加可执行文件替换为

add_executable(min main.c min.asm)

工作得很好:

Scanning dependencies of target min
[ 33%] Building C object CMakeFiles/min.dir/main.c.o
[ 66%] Building ASM_NASM object CMakeFiles/min.dir/min.asm.o
[100%] Linking C executable min
[100%] Built target min

我也尝试set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS "") 没有任何效果,所以用户对该属性的设置是否被忽略了?

【问题讨论】:

  • 你没有告诉 CMake 你的项目的“主要”语言是什么,所以它不能真正推断出如何链接你的可执行程序。在project 命令中添加LANGUAGES 子句。
  • 您只启用了ASM_NASM 语言,而不是C 语言。您需要启用要使用的所有种语言。
  • @Someprogrammerdude 经过一番调查,我认为这是一个 ASM_NASM 错误。

标签: c assembly cmake nasm


【解决方案1】:

我遇到了同样的问题,扩展名为“.s”。这工作正常:

set_source_files_properties(min.S PROPERTIES LANGUAGE ASM_NASM)

更笼统的:

file(GLOB_RECURSE src_asm "<path>/*.S" "<path>/*.s")
foreach(X IN ITEMS ${src_asm})
    set_source_files_properties(${X} PROPERTIES LANGUAGE ASM_NASM)
endforeach()
target_sources(target PRIVATE ${src_c} ${src_asm})

【讨论】:

    【解决方案2】:

    我认为这是一个错误。我使用 CMake 3.10.2,我注意到变量没有被应用。

    运行CMake 工具后,它会在构建目录中生成输出文件,如

    build_dir/CMakeFiles/3.10.2/
          |
          |__CMakeASM_NASMCompiler.cmake
          |
          |__CMakeCXXCompiler.cmake
          |
          |
         ...
    

    CMakeASM_NASMCompiler.cmake 看起来像:

    set(CMAKE_ASM_NASM_COMPILER "/usr/bin/nasm")
    set(CMAKE_ASM_NASM_COMPILER_ARG1 "")
    set(CMAKE_AR "/usr/bin/ar")
    set(CMAKE_ASM_NASM_COMPILER_AR "")
    set(CMAKE_RANLIB "/usr/bin/ranlib")
    set(CMAKE_ASM_NASM_COMPILER_RANLIB "")
    set(CMAKE_LINKER "/usr/bin/ld")
    set(CMAKE_ASM_NASM_COMPILER_LOADED 1)
    set(CMAKE_ASM_NASM_COMPILER_ID "NASM")
    set(CMAKE_ASM_NASM_COMPILER_VERSION "")
    set(CMAKE_ASM_NASM_COMPILER_ENV_VAR "ASM_NASM")
    
    
    set(CMAKE_ASM_NASM_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
    set(CMAKE_ASM_NASM_LINKER_PREFERENCE 0)
    

    可以看出变量CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS没有出现在文件中(即使它在CMakeLists.txt中明确设置)。

    添加条目后

    set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS "asm;nasm;S")
    

    进入文件并重新生成Makefile .S-files 组装就好了。

    【讨论】:

      最近更新 更多