2016-09-04 41 views
3

私は気になるモジュラーブートローダを持っています。私はcmakeに鼻を移植するよりも、ガスを使用するように設定するのは痛みが増えるだろうと感じました。そんなことではないようです。 NAsmはインクルードファイルを見つけることができません。私は何が欠けていますか?なぜcmakeからインクルードステートメントが見つからないのですか?

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

Failing_module/CMakeLists.txt:

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

./CMakeLists.txt:

コード全体がここ

This Github Repoで見つけることができ、プロジェクトのレイアウトである

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 /ステージ1/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になります

+0

正確なファイル名 'Print.inc'は' Failing_module'ディレクトリに特異的に存在しているあなたは絶対に確認してください?このエラーを過ぎても、あなたのコードはアセンブルされません。これは無効な 'mov si 'Hello World"です。 'Hello World'でラベルの後に(コードの後に​​)バイト文字列を作成し、そのラベルの名前を' mov si、hello'のように使用する必要があります。 –

+0

Print.incが実際にはそれを正しい場所に名づけました。私はこれを例として書いた。私は実際のコードを手作業でコンパイルしています。 –

+0

これは、あなたが得るエラーメッセージであり、何か他のものではないことを確かめます。あなたが与えた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") 
+0

これは機能します!少なくとも最小限の例では、 –

関連する問題