main.c
#include <stdio.h>
#include "sub.h"
int main(int argc, char *argv[])
{
int i;
printf("Main fun!\n");
sub_fun();
return 0;
}
sub.c
void sub_fun(void)
{
printf("Sub fun!\n");
}
sub.h
void sub_fun(void);
静态库:
gcc -c -o sub.o sub.c
ar crs libsub.a sub.o (将sub.o打包成libsub.a)
gcc -o test main.c libsub.a
运行:
不需要把静态库libsub.a放到板子上。
注意:执行arm-linux-gnueabihf-gcc -c -o sub.o sub.c交叉编译需要在最后面加上 -fPIC参数。
动态库
gcc -c -o sub.o sub.c
gcc -shared -o libsub.so sub.o sub2.o(可以使用多个.o生成动态库)
gcc -o test main.c -lsub -L libsub.so所在目录/
gcc -o test main.c libsub.so -L libsub.so所在目录/ (和上一条同效果)
动态库运行时候再调用,静态库是直接编译到执行文件中的,因此动态库生成的app文件比较小。
再执行动态库生成的app时,需要指定动态库目录
export LDLIBRARY_PATH=$LDLIBRARY_PATH:/libsub.so所在目录
很有用的gcc选项
gcc -E main.c // 查看预处理结果,比如头文件是哪个
gcc -E -dM main.c > 1.txt // 把所有的宏展开,存在1.txt里
gcc -Wp,-MD,abc.dep -c -o main.o main.c // 生成依赖文件abc.dep,后面Makefile会用
echo 'main(){}'| gcc -E -v - // 它会列出头文件目录、库目录(LIBRARY_PATH)