如何解决链接器错误“找不到-lgcc_s”

时间:2010-10-08 07:14:44

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

我有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标志。但我离不开它。

5 个答案:

答案 0 :(得分:7)

你有一个错字。 -no - 整个档案应该是--no-whole-archive。修复拼写错误修复了链接器错误。

答案 1 :(得分:5)

我认为--是问题所在:

-Wl,-no--whole-archive

尝试

-Wl,-no-whole-archive

修改

关于不在应用中使用nm应用看到测试符号:我认为您不需要-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

答案 2 :(得分:4)

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

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

- 詹姆斯坎泽

答案 3 :(得分:0)

整个归档工作,你只是没有链接lib。正确的做法是:

ar cr libtest.a test.o

并与

相关联
-Wl,--whole-archive -L/home/dumindara/intest/ -ltest

答案 4 :(得分:0)

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