From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Fri, 1 Nov 2002 00:34:58 +0600 From: Alexey Morozov To: Sisyphus mailing list Message-ID: <20021031183458.GS2322@bebi.novosoft.ru> Mime-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.4i Subject: [sisyphus] =?koi8-r?B?09fR2tnXwc7JxSDX?= ar Sender: sisyphus-admin@altlinux.ru Errors-To: sisyphus-admin@altlinux.ru X-BeenThere: sisyphus@altlinux.ru X-Mailman-Version: 2.0.9 Precedence: bulk Reply-To: sisyphus@altlinux.ru List-Unsubscribe: , List-Id: List-Post: List-Help: List-Subscribe: , List-Archive: Archived-At: List-Archive: Что-то я туплю не по-детски... То ли я дурак, то ли лыжи не едут... Итак, в задаче дано: -------- test29a.h ------- #ifndef __test29a_h #define __test29a_h #include using namespace std; class singleton { static singleton s; singleton() { cout << __PRETTY_FUNCTION__ << endl; } public: static singleton& get() { cout << __PRETTY_FUNCTION__ << endl; return s; } void run() { cout << __PRETTY_FUNCTION__ << endl; } }; #endif /* __test29a_h */ --------- test29a.h ----------- --------- test29a.cc ----------- #include "test29a.h" singleton singleton::s; --------- test29a.cc ----------- --------- test29b.h ----------- #ifndef __test29b_h #define __test29b_h #include using namespace std; class A { public: A() {cout << __PRETTY_FUNCTION__ << endl;}; void run(); }; #endif -------- test29b.h ------------ -------- test29b.cc ----------- #include "test29b.h" #include "test29a.h" void A::run(void) { cout << __PRETTY_FUNCTION__ << endl; singleton& s = singleton::get(); s.run(); -------- test29b.cc ----------- -------- test29.cc ------------ include "test29b.h" int main(void) { A a; a.run(); } ------- test29.cc ------------ Как видите, все довольно просто. Имеется класс singleton и пользующийся им класс A. Экземпляр класса A, в свою очередь инстанциируется в main. Все, вроде бы, законно. Более того, после for i in test29.cc test29a.cc test29b.cc; do c++ -c $i; done c++ -o test29 test29.o test29a.o test29b.o мы получаем вполне работоспособный бинарник. Однако, если мы после компиляции сделаем ar cru libtest29a.a test29a.o ar cru libtest29b.a test29b.o а затем c++ -o test29 test29.o libtest29a.a libtest29b.a то нас ждет... э-э-э, разочарование: alex@pyro alex/tmp/c++ $ c++ -o test29 test29.o libtest29a.a libtest29b.a libtest29b.a(test29b.o): In function `singleton::get()': test29b.o(.gnu.linkonce.t._ZN9singleton3getEv+0x2d): undefined reference to `singleton::s' collect2: ld returned 1 exit status alex@pyro alex/tmp/c++ $ _ Небольшое расследование показало, что причиной неверной сборки является /неправильный/ порядок указания библиотек. То есть, если libtest29b.a поставить перед libtest29a.a, то все слинкуется нормально. По-моему, это бага (хотя бы из соображений использования cross-linked библиотек внутри некоторого проекта). и ar, и ld из комплекта binutils-2.13.90.0.4-alt1 Что скажут ведущие си- и плюсоводы?