GCC系列: 加载静态链接库

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

 

 

 

©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页