>>>>> "Lars" == Lars Gullik Bj�nnes <[EMAIL PROTECTED]> writes:
Lars> What happens if you make a small test file with the crc_stuff...
Lars> does that work? or do you still get the linker error?
Lars> If we can create a valid test case for this one, we can also
Lars> bring the boost people into the loop.
OK, with latest boost, consider the following minimal testcase
----linkbug.C---------------
#include "boost/crc.hpp"
int main() {
boost::crc_32_type crc;
}
----------------------------
Compiler is gcc 2.95.2, but it seems that the situation is the same
with gcc 3.2 (can somebody confirm?)
On tru64 unix 4.0f, with native linker:
fantomas: g++ -I. -c linkbug.C ; g++ -o linkbug linkbug.o
/usr/bin/ld:
Unresolved:
boost::detail::crc_table_t<32, 79764919, true>::table_
collect2: ld returned 1 exit status
fantomas: nm linkbug.o | c++filt|grep '::table_'
boost::detail::crc_table_t<32, 79764919, true>::table_ | 0000000000000000 | U |
0000000000000000
On redhat linux 7.1 (still gcc 2.95.2 as compiler!)
schuss: g++ -I. -c linkbug.C ; g++ -o linkbug linkbug.o
schuss: nm linkbug.o | c++filt|grep '::table_'
00000000 V boost::detail::crc_table_t<32, 79764919, true>::table_
So on linux I have a weak symbol, whereas on tru64 all I have is an
external symbol, and link fails. It seems the problem is that weak
symbols are not supported on some non-GNU object formats, and gcc has
a problem with that. The following thread may give some hints:
http://gcc.gnu.org/ml/gcc/2002-08/msg01321.html
(although I am not sure this is the same problem)
We have solved this very same problem in other parts of LyX by moving
code from .C files to headers, so that I suspect this is related to
playing with #pragma interface/implementation (but I have not been
successful with that sofar).
Now if I change the test program to
--------linktest.C-----------------
#include "boost/crc.hpp"
template class boost::detail::crc_table_t<32, 79764919, true>;
int main() {
boost::crc_32_type crc;
}
-----------------------------------
then everything is alright:
fantomas: g++ -I. -c linktest.C ; g++ -o linktest linktest.o
fantomas: nm linktest.o | c++filt|grep '::table_'
boost::detail::crc_table_t<32, 79764919, true>::table_ | 0000000000001528 | D |
0000000000000000