我有一个程序和两个库; program
取决于lib1
,而lib1
取决于lib2
。后者是Debian标记为“私有”库的意思,因此它们列在pkglib_LTLIBRARIES
下。
program
的{{1}}:
Makefile.am
bin_PROGRAMS = program
program_SOURCES = program.c
program_LDADD = ../lib1/lib1.la
的{{1}}:
lib1
Makefile.am
的{{1}}:
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
是{ {1}}库。
我将sandbox留在了保管箱中。