【问题标题】:How to configure the source file directory and install location using GNU Autotools如何使用 GNU Autotools 配置源文件目录和安装位置
【发布时间】:2011-08-02 17:37:40
【问题描述】:

我想要一个这样的项目目录:

应用程序/
 |
  源/
  生成文件

所有 .cpp 和 .hpp、.h 文件都在 src 子目录中。如何配置Makefile.amconfigure.ac 让生成的Makefile 使用目录/src 作为源目录?以及如何让生成的可执行文件进入/usr/opt这样的指定目录?

另一个问题是,如果我想将我的程序制作为 .so 库,如何实现将其安装到 /usr/lib/usr/local/lib 的目标?以及如何使头文件变成/usr/local/include/app

【问题讨论】:

  • 这个问题和c++有什么关系?我要删除这个标签。

标签: makefile autotools


【解决方案1】:

通常,您只需添加

子目录 = src

到顶层 Makefile.am,并在 AC_CONFIG_FILES 中提及 src/Makefile。关于递归 make 有一些合理的抱怨,但如果你的所有源代码都在 src 中,那么 make 中的单级递归并不是真正的问题。将可执行文件放入 /usr/opt 是由用户在配置时设置前缀时完成的,在构建包时不应考虑。要构建可执行文件,请在 Makefile.am 中使用 bin_PROGRAMS,而要构建库,您应该使用 lib_LIBRARIES 或 lib_LTLIBRARIES(我个人倾向于使用 libtool 并使用后者。)

我认为您关于在 /usr/lib 或 /usr/opt 中安装的问题表明存在根本性的误解。构建软件包时,您绝对不关心这一点。作为包维护者,您指出程序应该安装在 $(prefix)/bin(或 $exec_prefix/bin,或 $bindir)中,并且库应该在 $libdir 中,但用户确定 $prefix 的位置和运行配置时的 $libdir 和 $bindir。 (通常人们只是设置前缀,bindir默认为$prefix/bin,而libdir默认为$prefix/lib。)

【讨论】:

  • 是的,您的解决方案是另一种方便的解决方案。感谢您的回复我想问的另一个问题是如何指定头文件的安装位置?我认为它也将由配置的 -prefix 决定。但是要在我的 Makefile.am 中添加什么?我在我的 Makefile 中尝试了“nobase_include_HEADERS = foo/Header.hpp”,它无法生成。能给点提示吗?
  • 错误是什么?如果 foo/Header.hpp 存在于相对于 Makefile.am 所在行的源目录中,它应该可以正常工作。
【解决方案2】:

通常对于可执行文件,您将拥有如下内容:

bin_PROGRAMS = foo
foo_SOURCES = $(top_srcdir)/src/foo_main.c \
$(top_srcdir)/src/foo_main.h \
$(top_srcdir)/src/something_else.c

这将安装在前缀目录的 /bin 目录中,虽然这不是您想要的,但它是您用户所期望的。

要做你想做的事,你需要这样做:

 myexedir = $(prefix)/opt
 myexe_PROGRAMS = foo
 foo_SOURCES = ...

其中 foo_SOURCES 同上。

对于图书馆来说,它只是:

lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = ...

它将安装在前缀目录的 /lib 目录中。设置 lib 的安装位置不取决于您(直接),而是由谁调用 configure:

./configure --prefix=/usr

将在 /usr/lib 中安装 lib(当调用 make install 时)

./configure

./configure --prefix=/usr/local

将使 lib 安装在 /usr/local/lib 中。

【讨论】:

  • 嗨@ldav1s。感谢您的回复我想问的另一个问题是如何指定头文件的安装位置?我认为它也将由配置的 -prefix 决定。但是要在我的 Makefile.am 中添加什么?我在我的 Makefile 中尝试了“nobase_include_HEADERS = foo/Header.hpp”,它无法生成。能给点提示吗?
【解决方案3】:

将 autoconf 和 automake 文件 configure.acMakefile.am 放在“src”目录中,并在文档中写下“./configure”命令应该在那里而不是在顶级目录中运行?否则你无法真正避免在顶层至少有一些 autoconf/automake 文件。

【讨论】:

  • 我不同意你的观点,我相信我们可以“远程制作”。好吧,我认为我们可以使用 AUTOMAKE_OPTIONS=subdir-objects 之类的东西,问题是如果远程制作,所有目标文件都将被放入 src 中,这很烦人,我不知道如何指定将对象放在哪里文件和可执行文件到另一个位置。
  • 也许我不明白你的真正目的。如果您想将目标文件与源文件分开,只需转到您想要保留它们的任何位置并运行 /where/ever/your/sources/are/app/src/configure ,它将自动从配置脚本所在目录。
  • 嗯......新编辑形式的问题与原始问题完全不同。现在有很多问题。我很困惑。
  • 对不起,我没有把整个问题都包括在内,现在我的目标显示在修改后的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多