初衷
工作中经常会碰到不同平台之间移植代码,项目中引入各种开源库,经常会碰到很多奇怪的编译、链接问题,这里做一下整理,尽量包含常见的大部分问题。首先我们来关注一下链接顺序引发的问题。
静态库链接顺序问题
最常见的问题
正常情况下(每个静态库之间没有相互依赖关系),静态库之间链接顺序是不需要关注的,但是如果两个库之间存在相互的调用,就会出现链接问题,看一个例子(头文件只声明函数,不再贴出):
//lib_a1.c
#include "lib_a1.h"
int a1_fun()
{
return 0;
}
//lib_a2.c
#include "lib_a2.h"
#include "lib_a1.h"
int a2_fun()
{
a1_fun();
return 0;
}
//main.c
#include "lib_a1.h"
#include "lib_a2.h"
int main()
{
//a1_fun();
a2_fun();
return 0;
}
#Makefile
all:main
lib_a1.a: lib_a1.o
ar rcs $@ $<
lib_a2.a: lib_a2.o
ar rcs $@ $<
main: main.o lib_a1.a lib_a2.a
gcc -o $@ main.o -l_a1 -l_a2 -L.
clean:
rm -rf *.o *.a *.so main
此时执行,会报未定义的问