How to test a C++ library usability in configure.in?

autoconf, autotools, c++, configure, usability

Solution

There might be a cleaner way of achieving this, but I think your problem is that C++ methods get "mangled" to allow additional information about the method (argument & return types etc) to be encoded. For example; the method `int A::foo(void)` will get mangled to something like `__ZN1A3fooEv`.

So you need to find the mangled name of a method in the library. You can do this by using the `nm` command on Unix-like OSs:

$ nm libifc++.so | grep ITString

It's worth mentioning that the exact mangling format varies across different compilers; and so by embedding a certain compiler's mangled symbol in your `configure.in` it may not work on other platforms - YMMV.

Note: you can use the `c++filt` utility to demangle a name back to it's human-readable form; so for the example I gave previously:

$ c++filt __ZN1A3fooEv
A::foo()

See Name Mangling in C++ on Wikipedia for more information.

Problem

I'm working on a C++ project on GNU/Linux and I'm looking for a way to test the existence and usability of IBM Informix's library with the Autotools - namely, editing a `configure.in`. I don't have experience with Autotools, so basically I'm picking up from the project's `configure.in` et al. scripts and copying&changing where I feel needs to be changed. IOW, I've been adapting from the existing text in `configure.in`. So far I've been using successfully the `AC_CHECK_LIB` in `configure.in` to test whether a certain library both exists and is usable. But this only seems to work with libraries with functions, not e.g. classes. Namely, this fails when testing Informix's `libifc++.so` library: ``` AC_CHECK_LIB(ifc++, ITString, INFORMIX_LIB="-L$INFORMIX_LIB_LOCATION/c++ -lifc++ -L$INFORMIX_LIB_LOCATION -L$INFORMIX_LIB_LOCATION/dmi -L$INFORMIX_LIB_LOCATION/esql -lifdmi -lifsql -lifasf -lifgen -lifos -lifgls -lifglx $INFORMIX_LIB_LOCATION/esql/checkapi.o -lm -ldl -lcrypt -lnsl", echo "* WARNING: libifc++.so not found!" INFORMIX_INC="" INFORMIX_LIB="" ) ``` I've also tried using other combinations, like `ITString::ITString`, etc. I haven't found a "pure" function in Informix's API (i.e., one that isn't contexted in a C++ class). So I'm hoping that either there's a way to use `AC_CHECK_LIB` in this context, or there's another `autoconf`/`configure.in` "command" for this specific use. Thanks in advance for your feedback.

Original source

Related problems