如何在automake中动态链接库?

时间:2015-07-03 03:07:26

标签: linux compiler-errors automake building launchpad

我正在尝试在lauchpad上构建一个包。为了构建它,我需要在automake中使用LDADD变量设置静态路径:

relay_LDADD = /usr/lib/x86_64-linux-gnu/libm.so /usr/lib/x86_64-linux-gnu/libX11.so.6 $(RELAY_LIBS)

这在64位构建上编译但在32位构建上失败。我尝试使用PKG_CHECK_MODULES,但它说

No package 'm' found
No package 'X11' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

我知道这不是非标准路径,因为启动板正在进行构建吗?我怎样才能让它发挥作用?

即使程序包在build-requires中指定了它们,构建也会在没有指定库的情况下失败。

1 个答案:

答案 0 :(得分:2)

你曾尝试过智胜系统,它已经让你失败了。

硬编码路径通常是一个坏主意。

Debian(和ubuntu只是一个衍生产品),已开始在依赖于体系结构的目录中发布二进制文件(如库),以允许在单个系统上安装多个体系结构。

这些库安装在/usr/lib/<host-triplet>中,其中<host-triplet>取决于架构;例如x86_64-linux-gnu是具有 linux gnu 工具的系统的 amd64 架构。 32位系统通常具有i386-linux-gnu的主机 - 三元组。

由于您将库路径硬编码到64位(/usr/lib/x86_64-linux-gnu/libm.so),因此在所有系统上都会失败,但 64bit / linux / gnu

相反,您应该告诉链接器链接 m 库(libm),然后转发 X11 库(libX11)。 让链接器关注正确的架构来选择:

relay_LDADD = -lm -lX11 $(RELAY_LIBS)

一般情况下,如果您要链接库 foo ,它提供了一个库文件libfoo.so,您将使用-lfoo(剥离前导{{1}跟踪lib)。

然而,有时这还不够;在这些情况下,您的库可能会使用.so来提供编译/链接此库所需的完整pkg-configCFLAGS

e.g。如果我想使用LDFLAGS

libquicktime

所以我会使用类似的东西:

 $ pkg-config --cflags libquicktime
 -I/usr/include/lqt
 $ pkg-config --libs libquicktime
 -lquicktime -lpthread -lm -lz -ldl

这适用于任何GNU(?)Makefile(与autotools无关)。 在autotools项目中,您可能会使用m4-macro myprog_CFLAGS += $(shell pkg-config --cflags libquicktime) myprog_LDADD += $(shell pkg-config --libs libquicktime)

将pkg-config检查移动到configure