如何在 automake 中动态 link 库?
How to dynamically link libraries in automake?
我正在尝试在 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.
我知道这不是非标准路径,因为 launchpad 正在构建?我怎样才能让它工作?
即使包在 build-requires 中指定了库,但没有指定库,构建失败。
你试图智取 buid 系统,它智取了你。
硬编码路径通常不是一个好主意。
Debian(ubuntu 只是一个衍生产品),已经开始在依赖架构的目录中发布二进制文件(如库),以允许在单个系统上安装多个架构。
这些库安装到 /usr/lib/<host-triplet>
,其中 <host-triplet>
取决于体系结构;例如x86_64-linux-gnu
是 amd64 体系结构,用于具有 linux 和 gnu[=59= 的系统] 工具。
32 位系统通常具有 i386-linux-gnu
.
的主机三元组
由于您将库路径硬编码到 64 位位置 (/usr/lib/x86_64-linux-gnu/libm.so
),这在所有系统上都会失败,但 64 位/linux/gnu.
相反,您应该告诉 linker link 反对 m 库 (libm
),resp X11 库 (libX11
)。
让 linker 关心选择正确的架构:
relay_LDADD = -lm -lX11 $(RELAY_LIBS)
一般来说,如果您想 link 针对提供库文件 libfoo.so
的库 foo,您可以使用 -lfoo
(去掉前导 lib
和尾随 .so
)。
然而,有时这还不够;在这些情况下,您的图书馆可能会使用 pkg-config
来提供针对该图书馆 compile/link 所需的完整 CFLAGS
和 LDFLAGS
。
例如如果我想使用 libquicktime
:
$ pkg-config --cflags libquicktime
-I/usr/include/lqt
$ pkg-config --libs libquicktime
-lquicktime -lpthread -lm -lz -ldl
所以我会使用类似的东西:
myprog_CFLAGS += $(shell pkg-config --cflags libquicktime)
myprog_LDADD += $(shell pkg-config --libs libquicktime)
这适用于任何 GNU(?) Makefile(与 autotools 无关)。
在 autotools 项目中,您可能会将 pkg-config 检查移动到 configure
,使用 m4-macro PKG_CHECK_MODULES
我正在尝试在 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.
我知道这不是非标准路径,因为 launchpad 正在构建?我怎样才能让它工作?
即使包在 build-requires 中指定了库,但没有指定库,构建失败。
你试图智取 buid 系统,它智取了你。
硬编码路径通常不是一个好主意。
Debian(ubuntu 只是一个衍生产品),已经开始在依赖架构的目录中发布二进制文件(如库),以允许在单个系统上安装多个架构。
这些库安装到 /usr/lib/<host-triplet>
,其中 <host-triplet>
取决于体系结构;例如x86_64-linux-gnu
是 amd64 体系结构,用于具有 linux 和 gnu[=59= 的系统] 工具。
32 位系统通常具有 i386-linux-gnu
.
由于您将库路径硬编码到 64 位位置 (/usr/lib/x86_64-linux-gnu/libm.so
),这在所有系统上都会失败,但 64 位/linux/gnu.
相反,您应该告诉 linker link 反对 m 库 (libm
),resp X11 库 (libX11
)。
让 linker 关心选择正确的架构:
relay_LDADD = -lm -lX11 $(RELAY_LIBS)
一般来说,如果您想 link 针对提供库文件 libfoo.so
的库 foo,您可以使用 -lfoo
(去掉前导 lib
和尾随 .so
)。
然而,有时这还不够;在这些情况下,您的图书馆可能会使用 pkg-config
来提供针对该图书馆 compile/link 所需的完整 CFLAGS
和 LDFLAGS
。
例如如果我想使用 libquicktime
:
$ pkg-config --cflags libquicktime
-I/usr/include/lqt
$ pkg-config --libs libquicktime
-lquicktime -lpthread -lm -lz -ldl
所以我会使用类似的东西:
myprog_CFLAGS += $(shell pkg-config --cflags libquicktime)
myprog_LDADD += $(shell pkg-config --libs libquicktime)
这适用于任何 GNU(?) Makefile(与 autotools 无关)。
在 autotools 项目中,您可能会将 pkg-config 检查移动到 configure
,使用 m4-macro PKG_CHECK_MODULES