undefined reference
От: sega__  
Дата: 08.06.06 17:01
Оценка:
Привет.
не могу решить такую проблему:

Есть библиотека, например libA.a, в которой определяется константа, например const int c=10;
которая объявляется в заголовке С.h как extern int c;
Есть заголовок M.h, который объявляет шаблон класса M, использующий константу с.
Далее, есть вторая библиотека, пусть libB.a, в которой используется класс M, и, соответственно, с.
Т.о. если я в своей программе использую заголовок M.h и библиотеку libB, я должен линковать обе библиотеки — libA и libB:
библиотеку libA для определения с, а libB для необходимой функциональности. При этом в libB константа с должна определяться посредством libA.
Вопрос: в каких случаях это не происходит? т.е. из libB не видно с, определенную в libA?
у меня выдает ошибку undefined reference.
компилятор g++ 3.4.4 под cywwin.
Re: undefined reference
От: Amouse Россия  
Дата: 08.06.06 17:09
Оценка:
Здравствуйте, sega__, Вы писали:

__>Привет.

__>не могу решить такую проблему:

__>Есть библиотека, например libA.a, в которой определяется константа, например const int c=10;

__>которая объявляется в заголовке С.h как extern int c;


а почему объявление с определением не в одном месте — c.h?
Re: undefined reference
От: LaptevVV Россия  
Дата: 08.06.06 17:09
Оценка:
Здравствуйте, sega__, Вы писали:

__>Привет.

__>не могу решить такую проблему:

__>Есть библиотека, например libA.a, в которой определяется константа, например const int c=10;

__>которая объявляется в заголовке С.h как extern int c;
__>Есть заголовок M.h, который объявляет шаблон класса M, использующий константу с.
__>Далее, есть вторая библиотека, пусть libB.a, в которой используется класс M, и, соответственно, с.
__>Т.о. если я в своей программе использую заголовок M.h и библиотеку libB, я должен линковать обе библиотеки — libA и libB:
__>библиотеку libA для определения с, а libB для необходимой функциональности. При этом в libB константа с должна определяться посредством libA.
__>Вопрос: в каких случаях это не происходит? т.е. из libB не видно с, определенную в libA?
__>у меня выдает ошибку undefined reference.
__>компилятор g++ 3.4.4 под cywwin.
Константы по умолчанию имеют внутренне связываение... То есть по умочанию видна тока в том модуле, в котором определена...
Чтоб сделать константу видимой в других модулях, надо:
// модуль А
extern const int a = 10;
// модуль В
extern const int a;
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: undefined reference
От: sega__  
Дата: 08.06.06 17:46
Оценка:
может более понятно будет:

// file C.h
class Color {...}; // реализация в libA
extern const Color GREEN; // обявление GREEN


// libA:
// file color.cpp:
include <C.h>
const Color GREEN  = Color(0, 255, 0); // реализация GREEN


// еще один класс, реализованный в libA
// file Foo.h
include <C.h>
class Foo {/*использует GREEN*/} // реализация в libA


Далее, другая библиотека
// file ClassB.h
include <Foo.h>
class ClassB {/* использует Foo (не GREEN)*/} // реализация в libB


т.е. libB использует класс Foo из libA, и, таким образом, неявно GREEN


Я использую ClassB:
// file myfile.cpp
#include <ClassB.h>
ClassB b;
//...


линкуется это с -lA -lB
пишет, что undefined reference in ClassB.cpp on GREEN...
Re[2]: undefined reference
От: Аноним  
Дата: 09.06.06 12:04
Оценка:
Попробуй:

// libA:
// file color.cpp:
include <C.h>
extern const Color GREEN  = Color(0, 255, 0); // реализация GREEN
Re[2]: undefined reference
От: Programmierer AG  
Дата: 09.06.06 13:02
Оценка: +1
Здравствуйте, sega__, Вы писали:

__>линкуется это с -lA -lB

__>пишет, что undefined reference in ClassB.cpp on GREEN...
Порядок линковки статических библиотек имеет значение. Т.к. libB зависит от libA, линковать надо -lB -lA.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.