【问题标题】:Why can't nasm find include statements from cmake为什么 nasm 找不到来自 cmake 的包含语句
【发布时间】:2016-09-04 20:10:13
【问题描述】:

我有一个正在玩弄的模块化引导加载程序。我觉得将它设置为使用气体比将 nasm 移植到 cmake 更痛苦。似乎并非如此。 NAsm 无法找到包含文件。我错过了什么?

完整代码可以在This Github Repo找到

这是项目布局:

.
├── CMakeLists.txt
└── Failing_module
    ├── CMakeLists.txt
    ├── Print.inc
    └── Stage1
        └── Stage1.asm

./CMakeLists.txt:

cmake_minimum_required(VERSION 3.6)
project(fails C ASM_NASM)
add_subdirectory(Failing_module)

Failing_module/CMakeLists.txt:

enable_language(ASM_NASM)
set(CMAKE_ASM_NASM_OBJECT_FORMAT bin)

set(module_SRCS Stage1/Stage1.asm)

set(CMAKE_NASM_LINK_EXECUTABLE nasm)
add_executable(Stage1.bin ${module_SRCS})
set_target_properties(Stage1.bin PROPERTIES LINKER_LANGUAGE NASM)
install(TARGETS Stage1.bin DESTINATION bin)

Failing_module/Stage1/Stage1.asm:

bits 16

jmp main

%include "Print.inc"
msgHello db "Hello World", 0x00

main:
    mov s, msgHello
    call Print

Failing_module/Print.inc

Print:
    lodsb
    or  al, al
    jz  PrintDone
    mov ah, 0x0E
    int 0x10
    jmp Print
PrintDone:
    ret

cmake的输出如下:

Failing_module/Stage1/Stage1.asm:6: fatal: unable to open include file `Print.inc'
make[2]: *** [Failing_module/CMakeFiles/Stage1.bin.dir/build.make:63:  Failing_module/CMakeFiles/Stage1.bin.dir/Stage1/Stage1.asm.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:86: Failing_module/CMakeFiles/Stage1.bin.dir/all] Error 2
make: *** [Makefile:128: all] Error 2

EDIT 现在应该手动编译。这使它成为 SSCCE

【问题讨论】:

  • 您绝对确定确切的文件名Print.inc 专门存在于Failing_module 目录中?即使您克服了此错误,您的代码也不会汇编,因为这是无效的 mov si "Hello World" 。您必须在其中包含 Hello World 的标签(在您的代码之后)创建一个字节字符串,并将该标签的名称与 mov si, hello 之类的名称一起使用
  • 确定 Print.inc 实际上是这样命名的并且在正确的位置。我写了这个作为例子。我已经通过手动方式编译了实际代码。
  • 您确定这是您收到的错误消息而不是其他错误消息吗?您提供的第一个 NASM 文件不可能组装起来,因为它的语法不正确。
  • 是的,我确定。 ibin.co/2txJI9WRDEV2.png 完整代码在github上并更新。
  • 我正在为此使用 CLion。当我从终端尝试它时,它起作用了......

标签: cmake nasm


【解决方案1】:

我认为这里的问题是 CMake 中的某些严格性与 NASM 中的缺陷相互作用不佳。 CMake 坚持搜索路径(例如 %include 路径)没有尾部斜杠。 nasm 坚持认为搜索路径(带有 -I 选项)确实有一个斜杠。 CMake 不会改变;它的开发人员do not regard this as a CMake bug。他们是对的:nasm 不应该坚持包含路径有一个斜杠。 The nasm fault 已经出名好几年了。

我设法通过将搜索路径隐藏为普通编译选项来解决此问题:

 add_compile_options(-I ${CMAKE_CURRENT_SOURCE_DIR}/ )
 add_library( my_lib STATIC "my_source.asm" )

【讨论】:

  • 它应该在nasm 2.14版本中修复。
猜你喜欢
  • 1970-01-01
  • 2013-03-05
  • 2020-11-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多