How do I deal with "undefined reference to dlopen" errors while compiling and using OpenFST on Ubuntu?
Trying to compile and use OpenFST on Ubuntu 13.10 leads to link errors like "undefined references to dlopen". How does one fix this? Searching online suggests including -ldl in the gcc command line, but that is not sufficient.
2 Answers
Compile as follows:
./configure LDFLAGS=-Wl,--no-as-needed
make
sudo make installTo compile your a.cpp which uses the library, do
g++ -I /usr/local/include a.cpp /usr/local/lib/libfst.so -Wl,--no-as-needed -ldlIt is important the -ldl appears after -Wl,--no-as-needed.
Running your program works as you'd expect from the README provided by OpenFST, you just need to have /usr/local/lib in your LD_LIBRARY_PATH. For example,
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" ./a.out As can be seen in the Catalogue of Built-In Rules:
Linking a single object file
nis made automatically fromn.oby running the linker (usually calledld) via the C compiler. The precise recipe used is:$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)
and Variables Used by Implicit Rules:
LDFLAGS
Extra flags to give to compilers when they are supposed to invoke the linker,
ld, such as-L. Libraries (-lfoo) should be added to the LDLIBS variable instead.
So in this case -ldl should be set or added to LDLIBS, not LDFLAGS.