未安装 autotools/libtool 共享库

Posted

技术标签:

【中文标题】未安装 autotools/libtool 共享库【英文标题】:autotools/libtool shared library not installed 【发布时间】:2020-10-06 23:30:08 【问题描述】:

也许有一些非常基本的东西我不知道,但我正面临一个非常奇怪的行为:在我的 libtool 共享库正确构建后,它会立即被删除。

基本上,这个Makefile.am

ACLOCAL_AMFLAGS = -I m4 --install

lib_LTLIBRARIES =

if BUILD_WIRINGPI_STUB
    lib_LTLIBRARIES += libwiringPiStub.la

    # headers to be installed
    include_HEADERS = \
    src/wiringPi-stub/wiringPi.h
endif

LIBTOOL_DEPS = @LIBTOOL_DEPS@

# libwiringPiStub.so,a
libwiringPiStub_la_LDFLAGS = -rpath '$(libdir)' -version-info $(WIRINGPI_STUB_SOVERSION)
libwiringPiStub_la_SOURCES = src/wiringPi-stub/wiringPi.c

pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = src/wiringPi-stub/libwiringPiStub.pc

生成这个构建历史,看起来不错:

% make libwiringPiStub.la
depbase=`echo src/wiringPi-stub/wiringPi.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
    /bin/sh ./libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT src/wiringPi-stub/wiringPi.lo -MD -MP -MF $depbase.Tpo -c -o src/wiringPi-stub/wiringPi.lo src/wiringPi-stub/wiringPi.c &&\
    mv -f $depbase.Tpo $depbase.Plo
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -g -O2 -MT src/wiringPi-stub/wiringPi.lo -MD -MP -MF src/wiringPi-stub/.deps/wiringPi.Tpo -c src/wiringPi-stub/wiringPi.c  -fno-common -DPIC -o src/wiringPi-stub/.libs/wiringPi.o
/bin/sh ./libtool  --tag=CC   --mode=link gcc  -g -O2 -rpath '/usr/local/lib' -version-info 1:0:0  -o libwiringPiStub.la  src/wiringPi-stub/wiringPi.lo  -lpthread -lm 
libtool: link: gcc -dynamiclib -Wl,-undefined -Wl,dynamic_lookup -o .libs/libwiringPiStub.1.dylib  src/wiringPi-stub/.libs/wiringPi.o   -lpthread -lm  -g -O2   -install_name  /usr/local/lib/libwiringPiStub.1.dylib -compatibility_version 2 -current_version 2.0 -Wl,-single_module
libtool: link: (cd ".libs" && rm -f "libwiringPiStub.dylib" && ln -s "libwiringPiStub.1.dylib" "libwiringPiStub.dylib")
libtool: link: ( cd ".libs" && rm -f "libwiringPiStub.la" && ln -s "../libwiringPiStub.la" "libwiringPiStub.la" )

事实上,make install 在我的 $(libdir) 中没有安装任何东西,要么是包含目录中的头文件。

这是make install 执行的输出:

% make install                       
cd . && /bin/sh ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
 /usr/local/bin/gmkdir -p '/usr/local/lib/pkgconfig'
 /usr/local/bin/ginstall -c -m 644 src/wiringPi-stub/libwiringPiStub.pc '/usr/local/lib/pkgconfig'

实际上,只有 .pc 文件实际移动到位。我可以尝试什么来解决这个问题?

【问题讨论】:

你确定你正在寻找正确的 libdir 和 includeir 吗?如果您在configure 项目时不覆盖默认前缀或覆盖那些特定的安装目录,则默认值应分别为/usr/local/lib/usr/local/include make install 命令是否成功完成?你能介绍一下它的输出吗? 我添加了make install 的输出,因为@JohnBollinger 的建议很遗憾没有成功 我最好的猜测是,当您 configure 项目时,BUILD_WIRINGPI_STUB 条件的评估结果为 false。正如您的示例所示,这不会阻止您通过将其名称显式指定为 make 来构建目标 libwiringPiStub.la,但它及其标头不会包含在安装中。在这种情况下,您还应该看到,除非您 明确命名,否则该库不会被构建——也就是说,它不会仅由 makemake all 构建。跨度> 【参考方案1】:

显示的 Automake 输入文件似乎没有任何本质上的错误,目标 libwiringPiStub.la 可以通过明确请求 make libwiringPiStub.la 来构建这一事实往往支持这一结论。

同时,make install 成功完成甚至没有尝试安装库或相关标头的事实强烈表明项目配置导致它们未包含在 lib_LTLIBRARIESinclude_HEADERS 的值中变量。在configure 时间,BUILD_WIRINGPI_STUB Automake 条件评估为 false 会自然而然地出现这种情况,但我认为没有理由认为如果条件评估为 true 也会发生同样的情况。因此,我希望您能找到问题所在。

您可以通过查看生成的Makefile 来验证条件是否负责。无论哪种方式,条件的主体都会出现在 Makefile 中,但如果条件的计算结果为 false,那么它将被注释掉。

【讨论】:

那真是狙击手!问题出在 AM_CONDITIONAL 中。我非常确定问题是由于 automake 导致我没有正确检查 autoconf。事实上,由于缺少子句,条件被评估为 false,尽管明确的目标是使 lib 无论如何都能正确构建(但不是安装)

以上是关于未安装 autotools/libtool 共享库的主要内容,如果未能解决你的问题,请参考以下文章

如何在交叉编译期间强制链接到未安装的库

强制 GCC 通知共享库中未定义的引用

erlang nif共享库上的未定义符号

Linux 共享库链接错误(未定义符号)

通过库共享时未注册 NestJS 自定义 PassportStrategy

对共享库函数的未定义引用