cmake 编译 nasm 文件

来源:互联网 发布:我知你好歌词 编辑:程序博客网 时间:2024/05/23 11:36

最近在学习《操作系统真象还原》,在学习的过程考虑到文件可能会过程中会写的文件比较多,想要使用cmake来配置最基本的编译方案,来减少后期过程中,手动编译带来的麻烦。


由于没有现成的例子,网上好多的版本都是汇编和c的混合编译,生成的代码都是基于平台相关的运行文件,这些只要全部交给c来处理就行了。

需求:编译nasm files

过程中踩了好多坑,留下记录备忘。

1 . cmake 和 nasm 对于头文件路径表示的冲突。
在cmake中include_directories() 函数是可以添加头文件路径的,并且是以不含 / 符号结束,例如~/include。但是 nasm 严格要求 -I 参数添加的头文件路径是包含 反斜杠 这样就造成一种风格上的冲突,include_directories()添加的路径在变成汇编编译参数的时候是不包含/的,造成编译失败,最开始的地方显示找不到头文件。
解决方案:
add_compile_options(-I ${CMAKE_CURRENT_SOURCE_DIR}/include/ )
顾名思义:使用这个函数直接添加编译参数,在字符串中增加反斜杠,来避免冲突,虽然看着有点别扭,但是解决了问题。

相似例子stackoverflow

2 . 网上cmake build assembly 内容太旧
截止2017.11.1日
VTK官网上关于cmake编译nasm 上说nasm不支持预编译,其实现在已经支持了,nasm 本来就自带 预编译参数 -e 将文件仅仅做预编译处理。

3 . cmake 在编译汇编文件的时候 很奇怪的会两次调用nasm
第一次是编译 第二次是链接。 其实第一次就已经编译完毕了。在第二次链接过程中,会报错,所以我们需要修改连接函数。
set(CMAKE_ASM_NASM_LINK_EXECUTABLE "nasm <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")

项目文件:

├── bin│   ├── 1.bin│   ├── loader.bin│   └── mbr.bin├── boot│   ├── CMakeLists.txt│   ├── include│   │   └── boot.inc│   ├── loader.S│   └── mbr.S├── CMakeLists.txt├── kernel│   ├── global.h│   ├── init.c│   ├── init.h│   ├── interrupt.c│   ├── interrupt.h│   ├── kernel.S│   └── main.c└── lib    ├── kernel    │   ├── io.h    │   ├── print.h    │   └── print.S    ├── stdint.h    └── user

boot/CMakeLists.txt 内容:

set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS nasm asm S)set(CMAKE_ASM_NASM_OBJECT_FORMAT bin)#set(CMAKE_NASM_LINK_EXECUTABLE nasm)#set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -f bin -l ~/1.txt")#只是生成汇编的预处理文件set(CMAKE_ASM_NASM_FLAGS "-e")#set(CMAKE_ASM_NASM_LINK_EXECUTABLE "ld <FLAGS> <CMAKE_ASM_NASM_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES>")#这个地方不需要连接的过程 原本的程序是调用了两次nasm 会报错#set(CMAKE_ASM_NASM_LINK_EXECUTABLE "cp <OBJECTS>  <TARGET>")set(CMAKE_ASM_NASM_LINK_EXECUTABLE "nasm <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")ENABLE_LANGUAGE(ASM_NASM)#头文件包含的目录 使用nasm的时候 由于目录不以 dir/ 结束所以无效include_directories(        include)#修改方式add_compile_options(-I ${CMAKE_CURRENT_SOURCE_DIR}/include/ )#修改输出的路径set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#add_executable(loader.bin loader.s)#set_target_properties(loader.bin PROPERTIES LINKER_LANGUAGE NASM)#add_executable(mbr.bin mbr.s)#set_target_properties(mbr.bin PROPERTIES LINKER_LANGUAGE NASM)add_executable(loader loader.S)add_executable(mbr mbr.S)#add_library(1  STATIC loader.S)#set_target_properties(1.bin PROPERTIES LINKER_LANGUAGE NASM)set_target_properties(mbr loader        PROPERTIES        SUFFIX .bin        )

根目录CMakeLists.txt内容:

cmake_minimum_required(VERSION 3.0)project(system)add_subdirectory(boot bin)

过程中踩了好多坑,基本官网文档都找不到,只能看开发者通讯邮件,慢慢摸索找到的,结合stackoverflow慢慢摸索出cmake编译nasm的流程。

原创粉丝点击