gpt4 book ai didi

linux - 如何动态链接automake中的库?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:07 25 4
gpt4 key购买 nike

我正在尝试在 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-gnuamd64 体系结构,适用于具有 linuxgnu 工具的系统。一个 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 (剥离前导 lib 和尾随 .so)。

然而,有时这还不够;在这些情况下,您的图书馆可能会使用 pkg-config提供完整CFLAGSLDFLAGS需要针对此库进行编译/链接。

例如如果我想使用 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 宏 PKG_CHECK_MODULES

关于linux - 如何动态链接automake中的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31197810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com