本文学习用Eclipse编译环境把源文件打包成静态库(*.a文件),以及在链接(Link)的过程中使用这个静态库文件。Hightec编译器版本是tricore v4.9.1.0。
1 问题引入
在平时工作编译软件的时候,通常是把源文件和头文件加入到项目中,然后再点击rebuild编译软件,如下图所示。
但是,在团队成员之间可能需要经常传输文件,大量的源文件传输十分不方便,而且其他人还需要重新编译一次。另外,涉及到和外部公司交互的时候(例如做好一部分功能的软件交付给其他公司),还有一个保密性问题。
将源文件打包成静态库文件,就可以很好地解决重复编译,以及内容保密封装的问题。
2 打包静态库过程
本章节在博主另一篇文章《Eclipse编译:创建一个AURIX工程》的基础上,将其中一部分源文件打包成静态库文件。
2.1 导入工程
1)打开Eclipse – File --import,然后弹出一个导入界面;
2)在弹出的Import窗口中,选择General – Existing Projects into Workspace – Next;
3)选择工程路径 – Finish;
4)然后就导入了上次创建的工程,左边的Explorer中会显示出源文件和头文件;
2.2 打包静态库
1)进入到工程文件夹中,把其中两个源文件剪切出来,只保留hello.c/system_tc27x.c和uart_init_poll.c三个文件。后续打包静态库的过程只打包这三个文件。
2)回到Eclipse中,右键 – refresh(或者F5),然后src文件夹中就只剩三个文件了。
3)右键工程 – Properties(或者Alt + Enter),打开工程的属性窗口。
4)点击 C/C++ Build – Settings – Build Artifact,然后将Artifact Type配置为Static Library,将Artifact Name配置为Mylib(自己起个名字),最后OK;
5)然后Rebuild Project,Eclipse自动打包源文件为静态库。
等待一会儿以后,下方的console窗口就会提示静态库打包完成。
6)左侧的Explorer中可以看到多了一个名为Archives的分类栏,其中包含一个libMylib.a文件;
在本地的工程路径下也可以获取这个静态库文件。
2.3 相关Makefile文件
打包静态库过程的背后也是执行了一部分Makefile文件,但是和编译链接有所不同。本节简单研究一下背后的Makefile文件。
1)点击左侧Explorer中的iRAM – makefile;
2)从makefile语句可以看出,打包静态库调用了tricore-ar这个工具;
在HIGHTEC的安装路径中可以找到它。
所以如果想要对静态库进行更加深入的了解,只需要在帮助手册中查找tricore-ar相关的说明即可。
3)回到makefile中,可以观察到输出libMylib.a文件所依赖的是目标文件,也就是说编译器先把源文件编译成目标文件(*.o),然后再把目标文件打包成静态库。
目标文件的定义和编译过程在另一个makefile中,subdir.mk文件。其中只有$(OBJS)是包含了内容。
从subdir.mk文件中可以看到,打包所用的目标文件可以和之前工程中保留的hello.c/system_tc27x.c和uart_init_poll.c三个源文件一一对应。
3 链接静态库过程
第2节中将hello.c/system_tc27x.c和uart_init_poll.c三个源文件打包成了一个libMylib.a静态库文件,本节就通过配置编译器,将这个静态库文件和其他目标文件链接到一起,生成elf文件。
3.1 修改工程
为了便于演示,本节就不再重新创建工程,而是在上一节的基础上修改工程配置。
1)在src文件夹中,把源文件换成之前没有打包的uart_poll.c和usr_sprintf.c两个文件。
后面会通过配置编译器,将这两个源文件编译为目标文件,再和之前的静态库链接起来。
2)创建一个lib文件夹,把静态库拷贝进去。
3)打开Eclipse工程,删除掉上一次的编译结果iRAM文件夹。
4)右键工程 – Properties,打开属性面板;点击 C/C++ Build – Settings – Build Artifact,然后将Artifact Type配置为Executable,将Artifact Name配置为Output,也就是输出的elf文件名称。
5)在Tool Settings中用命令行把静态库添加进去。另外,用-Wl, --start-group参数可以链接多个交叉静态库。
6)然后Rebuild Project,Eclipse会自动生成makefile并编译、链接。
本地的工程文件夹中就生成了这个elf文件。
3.2 相关Makefile文件
打开Makefile文件,可以看到之前自定义的一段参数写在了其中。
4 总结
本文学习了通过Eclipse环境打包静态库的方法,以及链接静态库的方法。其中还有许多相关的配置,需要按照工作中的需求来选择。