GCC Spec Files
另外,一些 toolchain ,因為平台的因素,無法使用 gcc 預設好的參數內容。於是要強迫使用者必需下一堆固定的參數,例如: Android 就在其 build system 裡,為 gcc 設定一堆和平台相關的參數,像是 -mthumb。於是,若使用該 toolchain 自行開發軟體,就誓必要找出這些參數,並正確的設定為 gcc 的參數。這完全是一堆苦工。其實,只要作 toolchain 的人多用點心,使用 toolchain 其實可以不用這麼累。
sysroot
一般而言,gcc 會到 /usr/lib 和 /usr/include 下找 library 、 header files 和其它一些 start files 、 end files。當我們在 build gcc 設定 --prefix=/path/to/xxx ,則 gcc 安裝到 /path/to/xxx ,也在該目錄下的 lib/ 和 include/ 找 library 和 header 。旦,若裝 gcc 移到其它目錄時, gcc 會找不到這些 library 。這時,我們可以在呼叫 gcc 時,給予 --sysrooot=/new/path/to/xxx 參數。如此,gcc 就會改以 /new/path/to/xxx 為參考目錄,去搜尋所需的幅程式和 library 等。
然而,要注意的是, ld 必需要能 support --sysroot。這必需在 configure binutils 時,給予 --sysroot=xxx 參數。xxx 可以是任意目錄,不一定是實際安裝的位置。這個參數的主要目的是使 ld 啟動 --sysroot 的功能。
Spec File
--sysroot 解決了一部分問題,但有更大部分的問題是 toolchain 往往要你設定一些固定參數。例如,你會需要設定一些 header file 的目錄,並且設定一些平台有關的參數。這些設定往往又臭又長,很容易出錯。其實,這些參數可以寫在 spec file 裡,使用者就不用一再的重復指定這些參數。例如,以下是我為 Android 設定的 spec file 的內容
%rename cc1_android old_cc1_android %rename cc1plus_android old_cc1plus_android*android_root: %R/../../../../../*android_product: generic*ccflags: %{!march=:-march=armv5te} %{!mtune=:-mtune=xscale} -mthumb \ -fno-strict-aliasing -finline-limit=64 -mthumb-interwork \ -fno-short-enums \ -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5TE__ \ -isystem %(android_root)bionic/libc/arch-arm/include/ \ -isystem %(android_root)bionic/libc/include \ -isystem %(android_root)bionic/libstdc++/include \ -isystem %(android_root)bionic/libc/kernel/common \ -isystem %(android_root)bionic/libc/kernel/arch-arm \ -isystem %(android_root)bionic/libm/include \ -isystem %(android_root)bionic/libm/include/arch/arm \ -isystem %(android_root)bionic/libthread_db/include \ -include %(android_root)system/core/include/arch/linux-arm/AndroidConfig.h \ -isystem %(android_root)system/core/include/arch/linux-arm/*cc1_android: %(old_cc1_android) %(ccflags)*cc1plus_android: %(old_cc1plus_android) %(ccflags)
像 Android 的 header files 就散置在一堆目錄,於是 build system 就指定了一堆參數。如果你自己寫個小程式,又不使用 Android 的 build system 時,就必需自己指定這些參數。於是,有人寫了一個 perl 的小程式,作為 gcc 的 wrapper ,幫你指定一些參數。其實不用這麼麻煩,只需像上例一樣,設定一個 spec file ,在執行 gcc 時加上一個參數就能自動套用這些參數
- gcc -specs myandroid.specs
spec file 設計的很有彈性,可以對參數列的內容進行修改,也可以加入條件性的參數。像上例 {!march=:...} 就是指定,當參數列沒有指定 -march= 的參數時,就在 cc1 的參數例加入 -march=armv5te。另外我還指定了一些巨集和 -system 指定一些 header file 的路徑。而這些路徑是相對於 %R ,也就是 --sysroot 所指定的路。例如 --sysroot=/my/path/to/the/kkk/ ,則 %(android_root)bionic/libm/include/arch/arm 就會對應到 /my/path/to/th/kkk/../../../../../bionic/libm/include/arch/arm 。
更進一步
--sysroot 的預設內容,其實是可以設定成相對於 gcc 本身的位置。在 configure 時,若
configure --with-sysroot='${exec_prefix}/xxx'
則編譯出來的 gcc ,其 sysroot 就會相對於其執行路徑。如此 user 甚至不必再手動指定 --sysroot 。
結論
有了 spec files ,我們只需設定 -specs 和 --sysroot 兩個參數就能解決所有的問題。其實在建 toolchain 時,應該再多花一點時間,幫 user 作好 spec files 。這樣的 toolchain 才方便使用。 關於 spec file 更詳細的內容,請參考 Spec Files
GCC Spec Files相关推荐
- linux spec文档解析
编译目录组成介绍 rpm-build 包和 /usr/src/redhat ,这些 rpm build 的程序是要靠 spec 文件的控制.它是配置指定安装到另外的机器上的,用来指示转换的源码补丁编 ...
- 【rpm】源码包制作rpm包|修改rpm、重新制作rpm包
目录 前言 安装rpmbuild rpmbuild制作rpm 包 同时生成devel包 修改rpm.重新制作rpm包 RPM 打包 工具 SPEC文件 spec文件关键字说明大全 rpmbuild的目 ...
- RPM打包探索(rpm-max翻译整理)
1. %global 和 %define 的区别? 这是内置宏,%define用来定义宏,%global用来定义一个全局可见的宏(在整个spec文件中可见) 2. %{!?macro-name} 和 ...
- 使用Tape和Vue Test Utils编写快速的Vue单元测试
by Edd Yerburgh 埃德·耶堡(Edd Yerburgh) 使用Tape和Vue Test Utils编写快速的Vue单元测试 (Write blazing fast Vue unit t ...
- PacBio sequence error correction amd assemble via pacBioToCA
Illumina二代测序有个致命缺陷,说到底还是基于PCR扩增的,所以存在偏向性和对于高GC含量区无法扩增等系统误差,测序错误是不可避免的,其次就是测序长度短:但其价格便宜,通量非常高,准确性达99% ...
- linux libpath的作用,linux – LD_LIBRARY_PATH似乎不起作用
我正在尝试编译测试文件: gcc -o test test.c -lg2c 但我得到错误: /usr/bin/ld: cannot find -lg2c 如果我使用: gcc -o test test ...
- exe解包和重新打包_pyinstaller打包的exe太大?你需要嵌入式python玄学 前提篇
pyinstaller打包一个exe动辄几十M几百M (特别是import pandas以后) 知乎上居然没有人po这方面的"知识"(手动狗头) 查了很多关于reduce pyin ...
- DockOne微信分享(八十四):Docker在B站的实施之路
本文讲的是DockOne微信分享(八十四):Docker在B站的实施之路[编者的话]B站一直在关注Docker的发展,去年成功在核心SLB(Tengine)集群上实施了Docker.今年我们对比了各种 ...
- Linux 应用---make及makefile的编写
Make 在我们做linux 开发中是必不可少的一部分,它在我们编写大型项目工程文件中起到非常大的作用. Make工程管理器也就是个"自动编译管理器",这里的"自动&qu ...
- 前端测试框架 jasmine 的使用
最近的项目在使用AngulaJs,对JS代码的测试问题就摆在了面前.通过对比我们选择了 Karma + jasmine ,使用 Jasmine做单元测试 ,Karma 自动化完成,当然了如果使用 K ...
最新文章
- 据廖雪峰python3教程----python学习第二天
- CSP认证201709-1	打酱油[C++题解]:贪心
- 一个几何级数的无限和思考
- 74-A/D指标,Accumulation/Distribution,积累/派发线,离散指标.(2015.7.1)
- CSS3 伪类和伪元素
- 诺基亚9 PureView五摄机皇再曝光 低配高价毫无诚意?
- intouch的报警怎么发到邮件上
- html5新增graph,Qunee for HTML5 - 中文 : Graph组件介绍
- php获取扫码枪的内容,C#_C#实现简单获取扫码枪信息代码,一个扫码枪遵循TCP协议,通过 - phpStudy...
- Thinkpad 笔记本 装win7 64 位操作系统热键驱动装不上问题解决!
- 流程图基础绘制方法和流程图制作软件功能详解
- win10照片查看器_Win10 下好用的免费无广告看图软件 XnView
- Springboot文件上传报错:failed to convert java.lang.String to org.springframework.util.unit.DataSize
- windows下安装与使用pix2tex(mathpix免费替代版)
- mtatlas mysql_MHA-Atlas-MySQL高可用(下)
- SpringCloud入门 —— SSO 单点登录
- eoLinker-AMS接口管理系统 项目管理教程
- CNN卷积核计算原理
- 2022年硝化工艺判断题及答案
- Windows10下载安装openjdk11及配置环境变量
热门文章
- ScrollView嵌套GridView,自定义Gridview动态设置Item的高度,屏幕适配
- 对vue.config.js中的代理服务器的理解
- vue-router的编程式导航
- 网页设计图片向上浮动_CSS实现图片向上浮动
- python io多路复用_Python之路--协程/IO多路复用
- java 不同时区时间转换_Java中的时区转换小结
- robotframework自动化测试修炼宝典_软件测试工程师必备:Robot Framework实现接口自动化实践!...
- mysql数据词典生成markdown_老板让我把数据库字典导出到Markdown格式的文件
- 玻璃质感_现代质感的顶层公寓,玻璃扶手让楼梯整个变透明!
- Springboot的工作机制:4 再谈谈自动配置