У меня есть программа и две библиотеки; program
зависит от lib1
, а lib1
зависит от lib2
. Последние подразумевают то, что Debian обозначает как «частные» библиотеки, поэтому они перечислены в pkglib_LTLIBRARIES
.
program
* Makefile.am
:
bin_PROGRAMS = program
program_SOURCES = program.c
program_LDADD = ../lib1/lib1.la
lib1
* Makefile.am
:
pkglib_LTLIBRARIES = lib1.la
lib1_la_SOURCES = lib1.c
lib1_la_LIBADD = ../lib2/lib2.la
lib2
* Makefile.am
:
pkglib_LTLIBRARIES = lib2.la
lib2_la_SOURCES = lib2.c
program.c
:
int lib1_function(void);
int main(int argc, char **argv)
{
return lib1_function();
}
lib1.c
:
int lib2_function(void);
int lib1_function(void)
{
return lib2_function();
}
lib2.c
:
int lib2_function(void)
{
return 0;
}
Это работает:
$ autoreconf -i
$ ./configure
$ make
$ sudo make install
Хотя я получаю примечательное предупреждение во время установки (которое может или не может быть Я имею какое-то отношение к моей настоящей проблеме), и я понятия не имею, что это за говядина:
libtool: warning: relinking 'lib1.la'
Если я переименую lib2_function()
впоследствии (в lib1.c
и lib2.c
), это произойдет :
$ make
(...)
libtool: link: gcc -g -O2 -o .libs/program program.o ../lib1/.libs/lib1.so -Wl,-rpath -Wl,/usr/local/lib/testprogram
../lib1/.libs/lib1.so: undefined reference to `lib2_function2'
collect2: error: ld returned 1 exit status
Это можно исправить, удалив перед перекомпиляцией, но я явно что-то делаю не так. Кажется, он связывает /usr/local/lib/testprogram/lib2*
вместо недавно скомпилированной версии библиотеки.
Почему?
Я также могу исправить это (как ошибку, так и предупреждение), изменив
pkglib_LTLIBRARIES = lib2.la
в
noinst_LTLIBRARIES = lib2.la
Я понимаю, почему (lib2
объединен в lib1
, поэтому его расходы исключены), но я не понимаю, что ему не понравилось, когда lib2
была pkglib
библиотека.
Я оставил свою песочницу в своем Dropbox.