【问题标题】:How to resolve linker error "cannot find -lgcc_s"如何解决链接器错误“找不到 -lgcc_s”
【发布时间】:2010-10-08 07:14:44
【问题描述】:

我有 3 个小文件用于制作静态库和应用程序:

test.h

#ifndef TEST_H
#define TEST_H

class Test
{
    public:
        Test();
};

extern Test* gpTest;

#endif

test.cpp

#include "test.h"

Test::Test()
{
    gpTest = this;
}   

Test test;

main.cpp

#include "test.h"
#include <iostream>

using namespace std;

Test* gpTest = NULL;

int main()
{
    return 0;
}

构建

g++ -c test.cpp -o test.o
ar cr test.a test.o
g++ -c main.cpp -o main.o
g++ main.o -o app -Wl,--whole-archive -L/home/dumindara/intest/test.a -Wl,-no--whole-archive

错误(链接步骤)

/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status

我尝试了所有方法:使用 -static-libgcc 并链接到静态 libstdc++。无法让这个工作。这一切都归功于 --whole-archive 标志。但我不能没有它。

【问题讨论】:

  • 您似乎忘记了实际的错误信息? :)
  • :D。是的,忘记了错误。已添加。

标签: c++ linux linker g++ static-libraries


【解决方案1】:

你有一个错字。 -no--whole-archive 应该是--no-whole-archive。修复错字修复链接器错误。

【讨论】:

    【解决方案2】:

    我认为-- 是这里的问题:

    -Wl,-no--whole-archive
    

    试试

    -Wl,-no-whole-archive
    

    编辑

    关于在您的应用中使用 nm app 看不到测试符号:我认为您不需要 -L,因为您提供了 test.a 的完整路径和名称 - 两者都可以

    -Wl,--whole-archive -L/home/dumindara/intest/ -ltest -Wl,-no-whole-archive
    

    -Wl,--whole-archive /home/dumindara/intest/test.a -Wl,-no-whole-archive
    

    【讨论】:

    • 是的,它现在可以链接了。但我仍然无法在我的应用程序中看到test 符号nm app。怎么办?
    • 谢谢德米特里,你救了我的命!!!我认为这个库实际上并没有得到喜欢。现在它工作正常。 :D
    【解决方案3】:

    关于到目前为止的 cmets:只需删除 -Wl 选项 完全。让 g++ 做它的事。

    至于用nm找不到符号测试,你为什么会期望 还要别的吗?你不使用它,你的程序不需要它, 所以它不会被拉进来。(如果由于某种原因你需要包括 未引用的目标文件,例如因为静态 初始化器将使其可见,然后指定对象 文件---不要把它放在库中,这是标准的方式 除非需要,否则不要包含它。)

    -- 詹姆斯·坎泽

    【讨论】:

    • 我将实际使用gpTest。不是那种形式:它将是一个向量,包含有关链接到程序的静态库的所有版本信息。因此,如果链接器丢弃test,这是一个问题。我认为这正是--whole-archive 解决的问题。我错了吗?
    【解决方案4】:

    whole-archive 工作,你只是没有链接库。正确的做法是:

    ar cr libtest.a test.o
    

    和链接

    -Wl,--whole-archive -L/home/dumindara/intest/ -ltest
    

    【讨论】:

      【解决方案5】:

      请注意:整体存档仅适用于静态库 (.a),不适用于共享库 (.so),这是我的经验。

      【讨论】:

      • 最好将其作为评论而不是答案。请看How to Answer
      猜你喜欢
      • 2023-03-29
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      相关资源
      最近更新 更多