GCC系列: 加载静态链接库

来源:互联网 发布:mac版excel破解 编辑:程序博客网 时间:2024/06/06 12:45

在 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参数


0 0
原创粉丝点击