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的流程。
- cmake 编译 nasm 文件
- NASM编译出PE文件[转]
- 如何编译文件(gcc + nasm)
- VS2015使用NASM编译汇编文件
- Visual Studio中使用NASM编译汇编文件
- Visual Studio 2008 中使用NASM编译汇编文件
- openssl nasm 编译
- CMake编译CppCMS的html模板文件
- cmake编译文件生成android工程
- CMake编译
- Cmake编译
- GCC跟NASM联合编译
- 安卓手机制作pc操作系统,安装nasm并编译asm汇编文件
- linux 用ld链接nasm编译的elf格式的.o文件报错
- CMake 简明教程(2)---编译库文件
- ubuntu系统下cmake 编译matlab中mex文件
- linux编译C++的cmake文件(CMakeList.txt)
- VS 2015 64位CMake编译openCV3.1.0必备文件
- Spring Boot——开发新一代Spring Java应用
- 创建登陆界面
- 二维DCT变换的实现
- AdaBoost算法有关内容
- TensorFlow学习日记26
- cmake 编译 nasm 文件
- <SQL必知必会>读书笔记
- 输入不同对象的姓名、性别、年龄、体重和住址等信息,并输出显示
- POJ 2096 Collecting Bugs 期望DP
- 【BZOJ1419】【期望DP】Red is good 题解
- 一般项目开发流程
- ubuntu 14.04 Clang编译安装,libclang解析c++代码
- 随机图 概率+组合数学
- arguments 转换成数组