Ошибка линковки при портировании с Solaris на Linux
От: balder  
Дата: 06.08.03 13:49
Оценка:
При линковке под 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 Россия  
Дата: 07.08.03 04:54
Оценка:
Здравствуйте, balder, Вы писали:

B>fooclass и foomethod были определены в одной из линкуемых библиотек.

Линкуемые библиотеки тоже gcc296 собраны?
Куплю оверлок. Хоть узнаю что это такое.
Re[2]: Ошибка линковки при портировании с Solaris на Linux
От: balder  
Дата: 07.08.03 05:16
Оценка:
Здравствуйте, Zlobec, Вы писали:

Z>Здравствуйте, balder, Вы писали:


B>>fooclass и foomethod были определены в одной из линкуемых библиотек.

Z>Линкуемые библиотеки тоже gcc296 собраны?
да c ключом -shared
Re: Ошибка линковки при портировании с Solaris на Linux
От: White Eagle Россия  
Дата: 07.08.03 08:41
Оценка:
Здравствуйте, balder, Вы писали:
B>Может кто подскажет в чем может быть проблема?

Приведи комманды компиляции и линковки под Линукс. Если используется makefile — вывод комманды make -n
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[2]: Ошибка линковки при портировании с Solaris на Linux
От: balder  
Дата: 07.08.03 09:04
Оценка:
Здравствуйте, White Eagle, Вы писали:

WE>Здравствуйте, balder, Вы писали:

B>>Может кто подскажет в чем может быть проблема?

WE>Приведи комманды компиляции и линковки под Линукс. Если используется makefile — вывод комманды make -n


g++296 -fPIC -g -DlinuxPlatform -DLINUX -DSABER \ 
-I/home/dmitry/tcsi/site/scm/osp/linux/PRIVATE/build/src/codegen/prog \ -I/home/dmitry/tcsi/site/scm/osp/linux/PRIVATE/build/src/codegen \
-I/home/dmitry/tcsi/osp/src/codegen \
-I/home/dmitry/tcsi/site/scm/osp/linux/include \
prog/cgLoadTemplate.so.o \
version.so.o \
-Wl,-rpath /home/dmitry/tcsi/site/scm/osp/linux/lib \
-L/usr/lib \
-L/home/dmitry/tcsi/site/scm/osp/linux/lib \
-lCodeGen \
-lutil \
-o codegen.tmp


util.so — библиотека, скомпилированная с ключом -shared из кучи объектников, скомпилированных
с ключом -c. В одном из этих объектников и было определение классов, при ссылке на методы которых вылетает
undefined reference
CodeGen.so и util.so лежат в /home/dmitry/tcsi/site/scm/osp/linux/lib
Re[3]: Ошибка линковки при портировании с Solaris на Linux
От: White Eagle Россия  
Дата: 07.08.03 09:21
Оценка:
Здравствуйте, 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
От: RXL  
Дата: 07.08.03 10:54
Оценка:
А если void ABC(int y) ?
Re: Ошибка линковки при портировании с Solaris на Linux
От: balder  
Дата: 07.08.03 13:35
Оценка:
Проблема оказалась не в описаниях классов, а в сборке библиотеки.
При последовательности:
1. Компилируются .o файлы c такими ключами:
 g++296 -fPIC -g <I... I... > -c -o foo1.so.o foo1.C
 g++296 -fPIC -g <I... I... > -c -o foo2.so.o foo2.C
 ... 
 g++296 -fPIC -g <I... I... > -c -o foon.so.o foon.C

2. Из скомпилированных файлов собирается библиотека libutil.so:
 g++296 -shared -o libutil.so foo1.so.o foo2.so.o ... foon.so.o

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 такими ключами:
 g++296 -fPIC -g <I... I... > -c -o foo1.so.o foo1.C
 g++296 -fPIC -g <I... I... > -c -o foo2.so.o foo2.C
 ... 
 g++296 -fPIC -g <I... I... > -c -o foon.so.o foon.C

2. Линкуем template.so.o вместе с скомпилированными на первом шаге объектниками, не собирая libutil
 g++296 -fPIC temlate.so.o version.so.o foo1.so.o foo2.so.o ... foon.so.o -o template

В этом случае все линкуется нормально.
То есть проблема в сборке библиотеки libutil, может я какие ключи пропустил?
(если собрать libutil без ключа -shared, то ошибки теже)
Подскажите в чем проблема ????
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.