在 mac osx 操作系统下, 请先移步-> GCC系列: Homebrew安装GCC和binutils.
GCC加载链接库会依赖加载顺序, 这样会导致无法调用预期的方法.
下面举例说明.
Car 和 Bus 都有 drive 函数, 在 main 里面调用谁的 drive, 取决于链接库的加载顺序.
Car.c
#include<stdio.h>
#include<stdlib.h>
int drive()
{
printf("Car driving...\n");
return 0;
}
void stop()
{
printf("Car stop.\n");
}
Bus.c
#include<stdio.h>
#include<stdlib.h>
int drive()
{
printf("Bus driving...\n");
return 0;
}
void start()
{
printf("Bus start.\n");
}
这里注意: Car 和 Bus 都有 drive.
现在把 Car.c 和 Bus.c 分别编译生成独自的静态库文件.
gcc-4.9 -shared -o libBus.so Bus.c
gcc-4.9 -shared -o libCar.so Car.c
编译完成之后, 会有对应的 so 库文件生成.
接下来, 开始使用这两个库文件.
main.c
#include<stdio.h>
#include<stdlib.h>
//
// 在 gcc 编译器下, 必须声明方法
// 在 clang 编译下, 只是给了警告
//
int drive();
void start();
void stop();
int main()
{
drive();
stop();
start();
return 0;
}
编译 main.c
gcc-4.9 -o app main.c -L ./ -lCar -lBus
运行 app
./app
Car driving...
Car stop.
Bus start.
我们交换一下链接库顺序再来编译 main.c
gcc-4.9 -o app2 main.c -L ./ -lBus -lCar
./app2
Bus driving...
Car stop.
Bus start.
可以看出, 编译时链接库顺序不一样, 调用的函数(drive)也不一样.
gcc 的 - l 和 -L 参数的用法, 可以移步: gcc -l参数和-L参数