【问题标题】:g++ library search failureg++ 库搜索失败
【发布时间】:2012-03-24 11:11:28
【问题描述】:

我的目录结构如下:

/
|
+--- /lib
|      libsomething.a
|      libsomething.so
|
+----/obj
       anObjFile.o

当我从obj 目录中运行以下命令时:

g++ -L../lib -lsomething anObjFile.o

我收到undefined reference 错误。显然gcc 找不到libsomething.a

但是现在如果我删除libsomething.so 然后重新运行命令,链接成功。

根据gcc documentation -lsomething 应该扩展为libsomething.a。那么为什么libsomething.so 的存在会导致库搜索失败呢?另外,我该如何解决这个问题?

我在 Linux Mint 12 上使用 gcc 版本 4.6.1。

【问题讨论】:

    标签: gcc linker g++


    【解决方案1】:

    .so 文件是一个动态库,这意味着每次运行程序时都会使用它。在这种情况下,您需要告诉您的操作系统(在这种情况下为 Mint)该动态库的位置,以便您的 prgramm 可以在运行时找到它。

    .a 文件是一个静态库,这意味着它需要的函数将在链接时复制到您的程序中。所以你的程序可以在没有库文件的情况下运行。

    如果没有其他说明,gcc 将假定您要使用动态库。如果它可以找到 .so 文件,它将使用它而不是 .a 文件。如果您想告诉 gcc 使您的程序成为静态的(使用 .a 文件),您可以将 -static 添加到您的 gcc 调用中。

    但是使用动态库时链接失败的原因尚不清楚。您是如何安装/构建库的?

    【讨论】:

    • Haatschii,我有一个问题:调用“g++ -L../lib -lsomething anObjFile.o”不应该强制 g++ 链接到静态库“libsomething.a”吗? gcc 文档清楚地表明“-lsomething”扩展为“libsomething.a”,而不是“libsomething.so”。或者,'libsomething.so'(动态库)的存在是否使 g++ 更喜欢它,即使在上述调用的情况下?
    • 我在上述评论中的问题在这里得到了解答:stackoverflow.com/questions/2545907/…。你是对的 Haatschii,这里选择了“libsomething.so”。现在,正如您所说,“libsomething.so”似乎存在问题。我要去调查那个。感谢您的回答:-)
    猜你喜欢
    • 2014-06-05
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多