I have a set of cpp files that I want to compile directly into a binary and also to compile into a shared library.
I have
bin_PROGRAMS=mybin
lib_LTLIBRARIES=libmylib.la
COMMON_SOURCES=f1.cpp f2.cpp f3.cpp
mybin_SOURCES=main.cpp $(COMMON_SOURCES)
libmylib_la_SOURCES=$(COMMON_SOURCES)
When I run this the cpp files are compiled twice, once with libtool and once without and sometimes libtool/automake complains
Makefile.am: object `f1.$(OBJEXT)' created both with libtool and without`
I tried putting COMMON_SOURCES into a .a file but then libtool complains when I link a .a with a .la (saying its not portable).
What I need is something like
bin_LTPROGRAMS=mybin
but that doesnt exist
edit: clarification – I am using automake/autoconf. What I have shown above is the meat of my automake Makefile.am
The issue is that the common sources need to be compiled differently when they are being made into a shared object than when they are being made into a static archive; in the case of the former, for example,
g++needs to be passed the-fPICflag.What I suggest is using two build directories.
Assuming this source hierarchy:
you would use something like this in
./src/Makefile.am:Then you create directories
ReleaseandReleaseDisableSharedin./. In directory./Releaseyou run:and in
./ReleaseDisableSharedyou run:After building in each build directory, you use the
mybinat./ReleaseDisableShared/src/mybinand thelibmylib.soat./Release/src/libmylib.so.See also: