Automake:Makefile.am 中 *_la_LDFLAGS 的有效值是啥?

Posted

技术标签:

【中文标题】Automake:Makefile.am 中 *_la_LDFLAGS 的有效值是啥?【英文标题】:Automake : what are the valid values for *_la_LDFLAGS in Makefile.am?Automake:Makefile.am 中 *_la_LDFLAGS 的有效值是什么? 【发布时间】:2008-10-31 16:36:14 【问题描述】:

我想知道 Makefile.am 中 *_la_LDFLAGS 的可能值是多少?

如果我问这个问题,那是因为我想要以下内容:

Actual shared library : libA.so (or with the version number I don't care)
Symbolic links :        libA-X.Y.Z.so, libA-X.so, libA.so 
soname :                libA-X.so

但是,这是我通过使用 -release 标志得到的:

Actual shared library : libA-X.Y.Z.so
Symbolic links :        libA.so 
soname :                libA-X.Y.Z.so    !!! this is not what I want 

我也尝试过完全没有标志并得到了

Actual shared library : libA-0.0.0.so    !!! 0.0.0 and not the real version
Symbolic links :        libA.so, libA-0.so
soname :                libA-0.so        !!! 0.0.0 and not the real version

我该怎么办?我应该使用哪个标志?

提前致谢

【问题讨论】:

【参考方案1】:

你应该使用Libtool的-version-info选项来指定库的接口版本,但一定要阅读 how versioning works(或here官方手册)

您还可以使用-release 来使您的软件包的版本号更加明显,但我怀疑您是否会得到您想要的确切名称。 Libtool 有自己的一套规则来定义如何命名文件以及根据系统创建哪些符号链接:这些确实应该被视为如何安装共享库的实现细节。

【讨论】:

【参考方案2】:

恕我直言,您想要的布局已损坏。由于 soname 的原因,链接到您的库的应用程序将依赖 libA-X.so。但是当 libA.so 是 X+1 版本时会发生什么? libA-X.so 符号链接指向什么?

您使用 -release 标志获得的布局背后的想法是,当应用程序与 -lA 链接时,它将导致它与最新版本链接。然后,由于 soname,它将在运行时依赖于 libA-X.Y.Z.so。当您安装新版本的库时,它将安装一个新的 libA-X.Y.Q.so,但它会留下旧版本 - 就像依赖它的旧应用程序所期望的那样。由于 libA 符号链接,新应用仍将链接到最新版本。

一些非常聪明的人多年来的想法已经进入了一个版本控制方案,该方案允许新应用程序链接到库的最新版本,同时允许多个版本和平共存以满足需要它们的应用程序的依赖关系。我的建议是,不要再猜测了。

【讨论】:

嗯,我明白你的意思。但是,假设我有一个与 libA-X.Y.Z.so 链接的库 B,并且我发布了 libA-X.Y.Q.so。如果我创建 RPM 并使用 YUM,我必须为包 B 指定 libA = X.Y.Z 而不是 libA >= X.Y.Z,我觉得它太严格了... lib B 可以毫无问题地使用更高版本。您可以查看另一个问题,以更好地了解使用 -release 困扰我的问题:***.com/questions/252819/…

以上是关于Automake:Makefile.am 中 *_la_LDFLAGS 的有效值是啥?的主要内容,如果未能解决你的问题,请参考以下文章

懒人学习automake, Makefile.am,configure.ac

懒人学习automake, Makefile.am,configure.ac(转)

automake 第三方库

如何使用 automake 启用安静构建?

未定义的引用使用 automake

如何使用 Automake 创建一个特定目录?