При линковке под Linux
Из скомпилированных с ключом -с библиотек линкуется исполняемый файл
При этом вылетает куча ошибок вида
undefined reference to <fooclass>::<foomethod(...)>
текст в месте ошибки такой
class cPtr : public fooclass {
public:
method1();
...
};
cPtr::method1()
{
foomethod(); //здесь вылетает undefined reference
...
}
fooclass и foomethod были определены в одной из линкуемых библиотек.
При компиляции и линковке под Solaris таких ошибок не возникает.
Под Linux использую gcc 2.96, под Solaris CC.
Может кто подскажет в чем может быть проблема?
Re: Ошибка линковки при портировании с Solaris на Linux
Здравствуйте, Zlobec, Вы писали:
Z>Здравствуйте, balder, Вы писали:
B>>fooclass и foomethod были определены в одной из линкуемых библиотек. Z>Линкуемые библиотеки тоже gcc296 собраны?
да c ключом -shared
Re: Ошибка линковки при портировании с Solaris на Linux
Здравствуйте, White Eagle, Вы писали:
WE>Здравствуйте, balder, Вы писали: B>>Может кто подскажет в чем может быть проблема?
WE>Приведи комманды компиляции и линковки под Линукс. Если используется makefile — вывод комманды make -n
util.so — библиотека, скомпилированная с ключом -shared из кучи объектников, скомпилированных
с ключом -c. В одном из этих объектников и было определение классов, при ссылке на методы которых вылетает
undefined reference
CodeGen.so и util.so лежат в /home/dmitry/tcsi/site/scm/osp/linux/lib
Re[3]: Ошибка линковки при портировании с Solaris на Linux
Здравствуйте, balder, Вы писали:
B>Здравствуйте, White Eagle, Вы писали:
WE>>Здравствуйте, balder, Вы писали: B>>>Может кто подскажет в чем может быть проблема?
WE>>Приведи комманды компиляции и линковки под Линукс. Если используется makefile — вывод комманды make -n
B>util.so — библиотека, скомпилированная с ключом -shared из кучи объектников, скомпилированных B>с ключом -c. В одном из этих объектников и было определение классов, при ссылке на методы которых вылетает B>undefined reference B>CodeGen.so и util.so лежат в /home/dmitry/tcsi/site/scm/osp/linux/lib
Похоже, строчка -lutil линкует тебе библиотеку libutil.so из /usr/lib. напиши вместо неё просто util.so без всякого -l. Вообще, насколько я помню, чтобы указывать библиотеку как -lxxx она должна называться libxxx.so и никак иначе.
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[4]: Ошибка линковки при портировании с Solaris на Linux
От:
Аноним
Дата:
07.08.03 10:15
Оценка:
Здравствуйте, White Eagle, Вы писали:
B>>util.so — библиотека, скомпилированная с ключом -shared из кучи объектников, скомпилированных B>>с ключом -c. В одном из этих объектников и было определение классов, при ссылке на методы которых вылетает B>>undefined reference B>>CodeGen.so и util.so лежат в /home/dmitry/tcsi/site/scm/osp/linux/lib
WE>Похоже, строчка -lutil линкует тебе библиотеку libutil.so из /usr/lib. напиши вместо неё просто util.so без всякого -l. Вообще, насколько я помню, чтобы указывать библиотеку как -lxxx она должна называться libxxx.so и никак иначе.
Извиняюсь, перепутал названия, библиотеки действительно называются libutil.so и libCodeGen.so.
Проблема не в этом... Я думаю проблема в различной записи объявлений в классах для Solaris и Linux
есть такой пример из документации по портированию
The following code sample contains an undefined reference:
error" ANSI C++ forbids declaration 'ABC' with no type"
error" (S) undefined reference to A::x"
#include<iostream>
class test
{
public:
A(int q) { x=q;}
ABC(int y);
private:
static int x;
};
A::ABC(int z)
{
cout << z << endl;
}
int main()
{
A test(10);
test.ABC(20);
return 0;
}
Following is the corrected code:
#include<iostream>
class test
{
public:
A(int q) { x=q;}
int ABC(int y);
private:
static int x;
};
int A::x=1;
int A::ABC(int z)
{
cout << z << endl;
}
int main()
{
A test(10);
test.ABC(20);
return 0;
}
но что здесь имеется в виду я не понял.
Re[5]: Ошибка линковки при портировании с Solaris на Linux
3. Из скомпилированного объектника линкуется исполняемый файл с использованием билиотеки libutil.so
g++296 -fPIC -g template.so.o version.so.o -L<путь до каталога с libutil.so> -lutil -o template
template.so.o содержит ссылки на методы классов, определенных в объектниках собранных на шаге 1.
По идее эти ссылки должны разрешиться, так как все объектники собраны в библиотеке libutil.so.
Но вылетают ошибки undefined reference
Если же сделать так:
1. Компилируются .o файлы c такими ключами:
В этом случае все линкуется нормально.
То есть проблема в сборке библиотеки libutil, может я какие ключи пропустил?
(если собрать libutil без ключа -shared, то ошибки теже)
Подскажите в чем проблема ????