先说下我出现的问题 undefined reference to xxx 的原因: 编译器选择不对,开发板代码 编译器工具 和 静态库工程的编译器 不一致。下面会具体介绍 怎么选择静态库编译器
这个编译器不对问题 我在看网上博客文章 介绍 静态库创建 和 导入的 相关文章 基本上没有看到强调的,所以在最开头写出来 作为强调.
静态库 动态库 区别
静态库 (扩展名为 .a 或 .lib) 是包含函数的文件,用于在link阶段整合执行程序,动态链接库(扩展名 .dll)是不在link阶段整合进执行程序中的。DLL文件在执行阶段动态调用。
嵌入式开发 我只见到用 静态库
先确认要创建的静态库工程需要用到的编译器
code blocks 打开要使用静态库的 项目工程, 然后右键项目 -> Build options
可以看到我的这个工程项目 输出 release 版本,Selected compiler 编译器 是 “PI32V2 r3 Ito Compiler”
Code::Blocks 创建静态库
File -> New -> Project -> Static library -> Go
输入静态库工程名,我这里随便填的 testlib
这一步 很重要 ,我上面在导入静态库 报错 undefined reference to xxx,就是这一步 编译器 选择错了。
在上面我已经查看了 我的开发板项目工程 编译器 Compiler 是 “PI32V2 r3 Ito Compiler”
注:code blocks中如果有多个项目,切换项目 :右键要选择的项目 -> Activate project
静态库工程 删除了 默认创建的main.c文件 , 新建了2个文件 hello.c 和 hello.h,如下图:
在工程目录下新建文件hello.c hello.h,然后在code blocks编辑器上右键静态库项目->Add files 添加刚才创建的文件
hello.c
#include "hello.h"
int SampleFunction1()
{
return 110;
}
hello.h
#ifndef __HELLO_H
#define __HELLO_H
#ifdef __cplusplus
extern "C" {
#endif
int SampleFunction1();
#ifdef __cplusplus
}
#endif
#endif
编译生成静态库
点 编译图标 或者 菜单栏 Build -> Build
注意:生成库版本 Release
编译成功后就可以在相应目录下找到 静态库文件 libtestlib.a
在其他工程项目中 导入 静态库
切换到要使用静态库的工程 (如果有多个项目在code blocks,右键要切换的项目 -> Activate project) 后
导入静态库
Settings -> Compiler
左边栏 选择 Global compiler settings , 右上边的 Selected compiler 选择 对应的编译器版本(上面已经知道),Linker settings 栏 点击 Add 添加静态库
下面介绍 在代码中调用静态库方法
将前面创建的静态库 头文件 hello.h 拷贝到 当前要使用静态库的工程中 (放到哪,自己看着办)
在要使用这个静态库方法的文件中 先include 头文件,然后 就可以调用 静态库中的方法了
xxx.c
//xxx
//静态库方法 头文件
#include "hello.h"
//xxx
void test(){
SampleFunction1(); //调用静态库方法
}
编译项目 Build -> Build
如果不报错 ,那么就到此结束了 ,可以去体验了