• GCC:编译时库路径和运行时库路径


     假设有如下依赖关系的一个程序:

    m 依赖于a

    a 依赖于b

    1. //a.c
    2. #include
    3. void b();
    4. void a()
    5. {
    6. printf("Here is a call b\n");
    7. b();
    8. }
    1. //b.c
    2. #include
    3. void b()
    4. {
    5. printf("Here is b\n");
    6. }
    1. //m.c
    2. #include
    3. void a();
    4. int main()
    5. {
    6. a();
    7. return 0;
    8. }

    编译动态库liba.so和libb.so:

    gcc -fpic -shared a.c -o liba.so

    gcc -fpic -shared b.c -o libb.so

    编译并连接程序m可能会遇到以下问题:

    1.直接编译连接m

    gcc -o m m.c

    因为无法找到m直接依赖的动态库liba.so中定义的函数a,所以报错:
    /usr/bin/ld: /tmp/ccpoXOmH.o: in function `main':
    m.c:(.text+0xe): undefined reference to `a'
    collect2: error: ld returned 1 exit status

    2.编译指定动态库a和b:

    gcc -o m m.c -la -lb

    由于默认的库文件路径里没有包含当前目录,因此报错:
    /usr/bin/ld: 找不到 -la
    /usr/bin/ld: 找不到 -lb
    collect2: error: ld returned 1 exit status

    可以通过两种方式解决:

    • 通过编译时参数-L,指定在当前目录下寻找库文件

            gcc -o m m.c -la -lb -L .

    • 通过设置LIBRARY_PATH

            export LIBRARY_PATH=./:$LIBRARY_PATH

            gcc -o m m.c -la -lb

    3.运行期错误:

    ./m
    ./m: error while loading shared libraries: liba.so: cannot open shared object file: No such file or directory

    这是由于在程序m加载时,无法在运行期连接库,因此报错。

    可以通过设置LD_LIBRARY_PATH解决运行期连接错误:

    export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

    ./m
    Here is a call b
    Here is b

  • 相关阅读:
    816. 模糊坐标 : 简单枚举运用题
    muduo异步日志库
    新版TCGAbiolinks包学习03:差异分析
    电力移动应用及终端安全溯源管控技术研究与实践
    ASPICE项目实战
    wireshark——解密加密报文
    c++, bunction & bind, async
    2169 -- 最大公约数题解
    GB/T 8924纤维增强塑料燃烧性能试验方法 氧指数法
    AndroidStudio报错:android.support.v4.app.Fragment
  • 原文地址:https://blog.csdn.net/jiemashizhen/article/details/126085458