I have the same problem as others have:
- I have a
*.lafile generated by libtool in an Automake project (e.g.module.la), - but I need the
*.soof it to use it fordlopen()(eg.module.so).
But: project is configured and built with --disable-shared to make sure the created main binary is one big statically linked program, e.g. main.x (easier for deployment and debugging). Thus *.so files are not created.
The program main.x is a huge framework-like application which is capable of loading extensions (modules) via dlopen() — despite it being linked statically.
This works fine when I build module.so by hand. But putting this to work in Makefile.am seems impossible to me. Yes, I can write lib_LTLIBRARIES, but with my standard --disable-shared I do not get a *.so file.
lib_LTLIBRARIES = module.la
module_so_SOURCES = module.cpp
The file module.la is created, which dlopen() refuses to load (of course).
I tried to put rules into Makefile.am building it manually and that works:
# Makefile.am (yes, .am)
all: mm_cpp_logger.so
SUFFIXES = .so
%.so: %.cpp
$(CXX) $(CXXFLAGS) -fPIC -fpic -c -I $(top_srcdir)/include -o $@ $<
%.so: %.o
$(CXX) $(LDFLAGS) -shared -fPIC -fpic -o $@ $<
But this can only be a workaround. I do not get all the nice auto-features like dependency-checking and installation.
How can I build module.so with still building the main program with --disable-shared (or with the same effect) in the Makefile.am-way?
- can I postprocess
*.lafiles to*.sofiles with a special automake rule? - can I tweak the
lib_LTLIBRARIESprocess to create*.sofiles in any case?
What you are looking for is called a module. You can tell Autotools to create a static binary (executable) by adding
-all-staticto theLDFLAGSof the application. I think this is the preferred way over using--disable-sharedconfigure flag (which really is aimed at the libraries rather than the executable)Something like this should do the trick:
The
.sofile will (as usual) end up in the.libs/subdirectory (unless you install it, of course).And you can build both your application and plugins in one go (even with a single
Makefile.am), so there is no need to callconfiguremultiple times.The use of
-fPIC(and friends) should be auto-detected by Autotools.Update: here’s a little trick to make the shared-libraries available where you expect them. Since all shlibs end up in
.libs/, it is sometimes nice to have them in a non-hidden directory.The following makefile snippet creates convenience links (on platforms that support symlinks; otherwise they are copied). Simply adding the snippet to your makefile (i usually use an
-include convenience-link.mk) should be enough (you might need anAC_PROG_LN_Sin your configure.ac)