【问题标题】:Problems when linking shared library链接共享库时的问题
【发布时间】:2012-06-05 13:00:58
【问题描述】:

以下是我如何使用共享库生成可执行文件的步骤。

  1. 我有三个文件:

    文件 libhello.c

    /* hello.c - demonstrate library use. */
    #include <stdio.h>
    void hello(void)
    { 
        printf("Hello, library world./n");
    }
    

    文件 libhello.h

    /* hello.h - demonstrate library use. */
    void hello(void);
    

    文件 main.c

    /* main.c -- demonstrate direct use of the "hello" routine */
    #include "hello.h"
    int main(void)
    {
        hello();
        return 0;
    }
    
  2. 我使用下面的命令来生成共享库。

    gcc -g -Wall -fPIC -c hello.c -o hello.o
    gcc -shared -W,soname,-libhello.so.0 -o libhello.so.0.0.0 hello.o
    
  3. 最后,我将库路径添加到LD_LIBRARY_PATH 变量中,并尝试使用共享库创建可执行文件。

    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    ln -s libhello.so.0.0.0 libhello.so.0
    gcc -g -Wall -c main.c -o main.o -I.
    gcc -o main main.o -lhello -L.
    

但是,在最后一步,有一个错误:找不到-lhello。那么,我哪里错了?

谢谢。

【问题讨论】:

    标签: c makefile shared-libraries


    【解决方案1】:

    gcc 在链接新程序时查找libhello.so。 libhello.so.0 用于搜索已链接程序的动态依赖项。

    换句话说:gcc -o main main.o -lhello -L. 查找 libhello.so,./main 查找 libhello.so.0。这允许为遗留程序提供多个版本的库,同时精确识别与已安装标头匹配的库。

    符号链接libhello.so -> libhello.so.0.0.0 应该可以解决问题。

    【讨论】:

    • 感谢您的回复。所以,你的意思是在第一次编译的链接阶段,我们需要创建一个额外的符号链接来使用ln 命令来玩这个把戏?是传统的吗?所有使用共享库的项目都应该玩这个把戏?
    • @thiton 告诉您将您的ln 命令更改为ln -s libhello.so.0.0.0 libhello.so。顺便说一句,这是相同的问题:[stackoverflow.com/questions/8411049/…
    • @acraig5075 ,所以每次更新libhello.so.x.x.x ,我都需要让libhello.so 指向新版本,对吧?也就是说,比如我把libhello.so.0.0.0更新为libhello.so.0.0.1,我需要再次执行命令:ln -s libhello.so.0.0.1 libhello.so,对吧?
    • @acraig5075 ,如何使用ldconfig 命令?听说可以用来更新软链接。
    猜你喜欢
    • 2019-04-19
    • 2022-01-05
    • 1970-01-01
    • 2011-09-17
    • 2023-03-10
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多