【问题标题】:Creating a simple shared library创建一个简单的共享库
【发布时间】:2010-11-14 15:28:06
【问题描述】:

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

library.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。现在我正在编写一个客户端来使用同一目录中的这个库。

client.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

谁能帮我找出我在这里做错了什么?

【问题讨论】:

    标签: c gcc shared-libraries


    【解决方案1】:

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

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

    假设.soclient.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 
    

    【讨论】:

    • 谢谢,但没有运气。仍然是同样的错误。我什至尝试指定完整路径,但没有成功。
    • 我通过直接提供库名称而不是通过 -l 来使其工作。
    • 我可以知道你为什么使用-soname,libmytest.so.1吗?
    • @codaddict:我猜是货物崇拜编码。
    • @codaddict:我发现其中一个教程说“-soname,libmytest.so.1”。正确的做法是什么?
    【解决方案2】:

    您缺少 -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 看看有没有链接。

    【讨论】:

    • 作为每次运行可执行文件时设置LD_LIBRARY_PATH的替代方法,您可以在链接它时设置LD_RUN_PATH,这会将共享库的附加搜索路径嵌入到可执行文件中。
    【解决方案3】:

    链接器通常只搜索库的系统路径。将-L 传递给gcc 以指定其他搜索路径。

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2012-02-15
      相关资源
      最近更新 更多