Как устранить ошибку компоновщика "не удается найти -lgcc_s" - PullRequest
0 голосов
/ 08 октября 2010

У меня есть 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;
}

BUILD

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 ]

7 голосов
/ 08 октября 2010

У вас есть опечатка.-no - весь архив должен быть --no-whole-archive.Исправление опечатки исправляет ошибку компоновщика.

5 голосов
/ 08 октября 2010

Я думаю, -- проблема здесь:

-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
4 голосов
/ 08 октября 2010

Что касается комментариев на данный момент: просто опустите опцию -Wl полностью. Пусть g ++ сделает свое дело.

Что касается отсутствия теста символа с нм, почему вы ожидаете что-нибудь еще? Вы не используете это, ваша программа не нуждается в этом, так что не втягивается. (Если по какой-то причине вам нужно включить объектный файл, на который нет ссылок, например, потому что статический инициализаторы сделают его видимым, затем укажите объект файл --- не кладите его в библиотеку, что является стандартным способом говоря не включайте его, если это необходимо.)

- Джеймс Канзе

0 голосов
/ 13 сентября 2011

Просто примечание: мой архив работает только со статическими библиотеками ( .a), а не с общими библиотеками ( .so).

0 голосов
/ 08 октября 2010

целый архив работает, вы просто не связываете lib.Правильно сделать следующее:

ar cr libtest.a test.o

и связать с

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