From: John P. <jo...@cu...> - 2008-01-30 04:26:45
|
Hi all, I tried to use my newly installed GCC/G++ 4.2.1-sjlj compiler to link some simple C++ code to a pre-compiled copy of Boost 1.34.1 that I have on my system (which I earlier built using GCC 3.4.5). It seems to fail with a simple 'test' fragment as shown below. I'm puzzled about what this error message means. Is it simply that I must create a while new set of Boost DLLs that I can use with GCC 4? Why is the error message coming from a missing file in libstdc++.a -- does that mean that I am actually statically linking against Boost? (I thought I was dynamically linking, but perhaps I was wrong?) Cheers JP scons: Configure: Checking for Boost libraries... .sconf_temp\conftest_4.cpp <- | |#include <sstream> |#include <boost/archive/text_oarchive.hpp> |#include <boost/archive/text_iarchive.hpp> | |int main(void){ | std::stringstream ss; | int x1=1; | const int &x = x1; | boost::archive::text_oarchive oa(ss); | oa & x; | return 0; |} | g++-sjlj -o .sconf_temp\conftest_4.o -c -g -Wall -IC:\mingw\include "-IC:\Program Files\Boost-1.34.1\include" .sconf_temp\conftest_4.cpp g++-sjlj -o .sconf_temp\conftest_4.exe .sconf_temp\conftest_4.o -LC:\mingw\lib "-LC:\Program Files\Boost-1.34.1\lib" -lgsl -lgslcblas -lm -lboost_serialization-mt C:\mingw\lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0x7b): undefined reference to `__w32_sharedptr_unexpected' C:\mingw\lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0x8c): undefined reference to `__w32_sharedptr_terminate' C:\mingw\lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x67): undefined reference to `__w32_sharedptr_terminate' C:\mingw\lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x97): undefined reference to `__w32_sharedptr_unexpected' C:\mingw\lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0xb3): undefined reference to `__w32_sharedptr_terminate' C:\mingw\lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0xd3): undefined reference to `__w32_sharedptr_unexpected' collect2: ld returned 1 exit status scons: Configure: no |
From: Brian D. <br...@de...> - 2008-01-30 04:37:54
|
John Pye wrote: > I'm puzzled about what this error message means. Is it simply that I > must create a while new set of Boost DLLs that I can use with GCC 4? Why > is the error message coming from a missing file in libstdc++.a -- does > that mean that I am actually statically linking against Boost? (I > thought I was dynamically linking, but perhaps I was wrong?) Whether you are linking staticically or dynamically depends on how you configured and built boost. You can tell by looking at whether you have a just libboost*.a or libboost*.dll.a+libboost*.dll. > g++-sjlj -o .sconf_temp\conftest_4.o -c -g -Wall -IC:\mingw\include > "-IC:\Program Files\Boost-1.34.1\include" .sconf_temp\conftest_4.cpp > g++-sjlj -o .sconf_temp\conftest_4.exe .sconf_temp\conftest_4.o > -LC:\mingw\lib "-LC:\Program Files\Boost-1.34.1\lib" -lgsl -lgslcblas > -lm -lboost_serialization-mt > C:\mingw\lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0x7b): undefined > reference to `__w32_sharedptr_unexpected' > C:\mingw\lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0x8c): undefined > reference to `__w32_sharedptr_terminate' > C:\mingw\lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x67): > undefined reference to `__w32_sharedptr_terminate' > C:\mingw\lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x97): > undefined reference to `__w32_sharedptr_unexpected' > C:\mingw\lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0xb3): > undefined reference to `__w32_sharedptr_terminate' > C:\mingw\lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0xd3): > undefined reference to `__w32_sharedptr_unexpected' > collect2: ld returned 1 exit status > scons: Configure: no Those functions mentioned in the error are from gcc 3.4. They are part of the mechanism that allows exceptions across DLLs to work with static libgcc. That patch is not in gcc 4.2, where instead if you need this capability you use shared libgcc. This difference might represent an ABI change, which would mean C++ code using exceptions needs to be rebuilt. The question is why are these symbols getting involved in your link at all. What what version of gcc did C:\mingw\lib/libstdc++.a come from? Brian |
From: John P. <jo...@cu...> - 2008-01-30 07:10:18
|
Hi Brian, Brian Dessent wrote: > John Pye wrote: > > >> I'm puzzled about what this error message means. Is it simply that I >> must create a while new set of Boost DLLs that I can use with GCC 4? Why >> is the error message coming from a missing file in libstdc++.a -- does >> that mean that I am actually statically linking against Boost? (I >> thought I was dynamically linking, but perhaps I was wrong?) >> > > Whether you are linking staticically or dynamically depends on how you > configured and built boost. You can tell by looking at whether you have > a just libboost*.a or libboost*.dll.a+libboost*.dll. > My Boost lib directory had .a files as well as .dll files. I discovered, using MinGW GCC 3.4.5, that the presence of the .a files is causing static linking (I should have realised that). So I delete the .a files and I get dynamic linking. Woops. I guess I should have these DLLs and static libraries in different directories, so that I can select which I want. Cheers JP |
From: Brian D. <br...@de...> - 2008-01-30 07:45:27
|
John Pye wrote: > My Boost lib directory had .a files as well as .dll files. I discovered, > using MinGW GCC 3.4.5, that the presence of the .a files is causing > static linking (I should have realised that). So I delete the .a files That's not how it is supposed to work. If you have import libraries (.dll.a) they are searched ahead of static libs (.a) in the search order, and you will link to the shared (DLL) version of the library. So you most certainly don't have to go deleting .a files or putting them in another location. It is very common to have both in the same place. If boost isn't generating import libs then *that* is the problem, not the presence of static archives. Brian |