undefined reference to `__ctype_b'

when i compile my program, i meet the following error:
...
undefined reference to `__ctype_b'
...

anybody knows which shared library should be linked during make?

thanks a lot!

The name is mangled. I dunno. What headers outside of the standard C library headers are in the file? ie NOT <stdio.h> <string.h> etc.

I just link 3rd part archive file (xerces-c.a) to make my own program.

the error looks like:

./lib_2_8_64bit/libxerces-c.a(XMLString.o): In function `xercesc_2_8::XMLString::trim(char*)':
XMLString.cpp(.text+0xa85): undefined reference to `__ctype_b'
XMLString.cpp(.text+0xab0): undefined reference to `__ctype_b'
collect2: ld returned 1 exit status
make: *** [all] Error 1

however, if i link shared library (xerces-c.so) instead of .a file, then it compiles.

so any tips or tricks when linking the static library?

The .a file may still have external symbols that are resolved in the shared library.
Are you trying a static link?

nm xerces-c.a | grep ctype_b

will list your symbol. I would guess that you will see ctype_b listed as external, meaning it has to be resolved somewhere else. Do you have any other xerces archives you can grep through?

Another thought - you may not be aware that the order of libraries linked against is important. Try moving the .a file to the first element in the -l list.

Also, you may need to put something like the std c++ library as the last in that list - in other words some standard shared libraries may need to be parsed for symbols more than once.

What is happening: the .a file is introducing symbols that were not in the original object file, these extern symbols were probably available earlier, but ld skipped over them because they were not needed at that time.

thanks jim. your guess is right - ctype_b listed as external.

i tried to move link order according to your suggestion. but it still does not work.

you can compare the symbols of both .so and .a .... check if the symbol is available in .so. If not then it may be taking it from some other .so