Может ли библиотека pkglib зависеть от другой библиотеки pkglib? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть программа и две библиотеки; 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.

...