代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

创建简单的共享库

  •  3
  • Navaneeth K N  · 技术社区  · 14 年前

    我正在尝试使用GCC学习linux上的共享库概念。所以我创建了一个简单的库。

    图书馆c

    int foo(void)  {
        return 10;
    }
    

    这是用,

    cc -fPIC -g -c library.c
    cc -shared -fPIC -Wl,-soname,libmytest.so.1 -o libmytest.so.1.0.1 library.o -lc
    

    它创建了文件 libmytest.so.1.0.1 在当前目录中。现在我正在编写一个客户机来使用同一目录中的这个库。

    客户c

    #include <stdio.h>
    
    extern int foo(void);
    
    int main()
    {
        int a = foo();
        printf("a is %d", a);
        return 0;
    }
    

    编译时使用,

    cc client.c -o client -lmytest
    

    但这是伴随着信息而来的

    /usr/bin/ld: cannot find -lmytest
    collect2: ld returned 1 exit status
    

    有人能帮我找出我在这里做错了什么吗?

    3 回复  |  直到 14 年前
        1
  •  6
  •   codaddict    14 年前

    尝试使用 -L 选项,用于将目录添加到要搜索的目录列表中 -l 选项:

    cc client.c -L. -o client -lmytest
    

    假设 .so 与位于同一目录中 client.c . 如果没有添加合适的路径。

    看的链接器 -lmytest 寻找 libmytest.so 但是你有一个附加的版本号,所以它不起作用。解决这个问题的方法是创建一个名为 libmytest.so公司 指向 libmytest.so.1.0.1

    ln -s libmytest.so.1.0.1 libmytest.so   
    

    或者,您可以在编译/链接行上使用完整的库名称:

    cc client.c ./libmytest.so.1.0.1 -o client 
    
        2
  •  1
  •   Ignacio Vazquez-Abrams    14 年前

    链接器通常只搜索库的系统路径。通过 -L gcc 以便指定要搜索的其他路径。

        3
  •  1
  •   James Kastrantas    14 年前

    您缺少-Ldir选项。

    从GCC手册页:

    -Ldir  Add directory dir to the list of directories to be searched for -l.
    

    如果尝试运行可执行文件,还需要指定共享库的位置,否则将找不到该库。这可以通过以下方法完成:

    LD_LIBRARY_PATH=. ./client

    编辑:

    谢谢,但运气不好。还是一样的 错误。我甚至试着说明 完整的路径,但不起作用。

    我认为链接器需要库具有.so扩展名。尝试 ln -s libmytest.so.1.0.1 libmytest.so 看看是否有联系。