Проблема в том, что не удается заставить собрать проект так, чтобы библиотеки прилинковывались статически. Проект собирается с autotools, я проиллюстрирую проблему на простейшем hello-world проекте, буду очень благодарен, если кто-нибудь укажет на мои ошибки.Сначала покажу, как все работает без autotools. Код hello.cc:
#include <iostream>
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
Компилируем:
$ g++ -o hello hello.cc
Получаем бинарник hello, 8829 байт. Теперь попробуем прилинковать к нему какую-нибудь библиотеку:
$ g++ -o hello hello.cc -lxml2
Получаем немного больший файл, 9077 байт. Теперь попробуем прилинковать его статически:
$ g++ -static -o hello hello.cc -lxml2
Получаем файл в 1263359 байт, т.е. все прилинковалось нормально. Теперь попробуем сделать то же, но с autotools.
Создаем проект, вот файл configure.ac:
AC_INIT(hello,1.0)
AM_INIT_AUTOMAKE(hello,1.0)
AM_CONFIG_HEADER(config.h)
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_PROG_LIBTOOL
AC_OUTPUT(Makefile)
и файл Makefile.am:
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = hello
hello_SOURCES = hello.cc
hello_LDADD = -lxml2
hello_LDFLAGS = -L/usr/lib
генерируем файлы проекта:
$ libtoolize --force && aclocal && autoconf && autoheader && automake --add-missing --gnu
You should add the contents of `/usr/share/aclocal/libtool.m4' to `aclocal.m4'.
configure.ac:2: installing `./install-sh'
configure.ac:2: installing `./missing'
Makefile.am: installing `./depcomp'
./configure - появился Makefile, собираем:
$ make
make all-am
make[1]: Entering directory `/home/andrey/test'
g++ -DHAVE_CONFIG_H -I. -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.cc
mv -f .deps/hello.Tpo .deps/hello.Po
/bin/bash ./libtool --tag=CXX --mode=link g++ -g -O2 -L/usr/lib -o hello hello.o -lxml2
mkdir .libs
g++ -g -O2 -o hello hello.o -L/usr/lib /usr/lib/libxml2.so
Получаем файл hello размером 43086 байт, с динамически прилинкованой библиотекой. В куче доков, которые я перерыл, советуют добавлять -static к _LDFLAGS, это не имеет никакого эффекта:
$ make
make all-am
make[1]: Entering directory `/home/andrey/test'
g++ -DHAVE_CONFIG_H -I. -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.cc
mv -f .deps/hello.Tpo .deps/hello.Po
/bin/bash ./libtool --tag=CXX --mode=link g++ -g -O2 -static -L/usr/lib -o hello hello.o -lxml2
mkdir .libs
g++ -g -O2 -o hello hello.o -L/usr/lib /usr/lib/libxml2.so
Советуют также делать ./configure --disable-shared, это тоже ничего не меняет.
./configure --disable-shared
...
checking whether to build shared libraries... no
checking whether to build static libraries... yes
...
$ make
make all-am
make[1]: Entering directory `/home/andrey/test'
g++ -DHAVE_CONFIG_H -I. -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.cc
mv -f .deps/hello.Tpo .deps/hello.Po
/bin/bash ./libtool --tag=CXX --mode=link g++ -g -O2 -static -L/usr/lib -o hello hello.o -lxml2
mkdir .libs
g++ -g -O2 -o hello hello.o -L/usr/lib /usr/lib/libxml2.so
Что еще делать, ума не приложу. Подскажите, пожалуйста, в чем я не прав.