我想要一个这样的项目目录:
<>以前app/|src/Makefile 之前所有.cpp和.hpp, .h文件都在src
子目录中。如何配置Makefile.am
或configure.ac
,使生成的Makefile使用目录/src
作为源目录?以及如何让生成的可执行文件进入指定的目录,如/usr/opt
?
另一个问题是,如果我想让我的程序作为一个。so库,如何实现我的目标,使其安装到/usr/lib
或/usr/local/lib
?如何使头文件像/usr/local/include/app
?
通常,您只需添加
<>之前SUBDIRS = src之前到顶层的Makefile。在AC_CONFIG_FILES中提到src/Makefile。对递归make有一些合理的抱怨,但如果所有的源代码都在src中,那么make中的单级递归就不是真正的问题。将可执行文件放入/usr/opt中是用户在配置时设置prefix时完成的,在构建包时不应该考虑这个问题。要构建可执行文件,请在Makefile中使用bin_PROGRAMS。要构建一个库,您应该使用lib_LIBRARIES或lib_LTLIBRARIES(就个人而言,我倾向于使用libtool并使用后者)。
我认为你关于安装在/usr/lib或/usr/opt的问题表明了一个根本性的误解。在构建包时,您完全不关心这个问题。作为包的维护者,您指出程序应该安装在$(prefix)/bin(或$exec_prefix/bin,或$bindir)中,库应该安装在$libdir中,但是用户在运行configure时确定$prefix、$libdir和$bindir的位置。(通常,人们只设置前缀,bindr默认为$prefix/bin,而libdir默认为$prefix/lib)
通常对于可执行文件,您将使用如下格式:
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
将使lib安装(当make install被调用时)在/usr/lib
./configure
或
./configure --prefix=/usr/local
将使lib安装在/usr/local/lib中。
将autoconf和automake文件配置。ac和Makefile。Am 在"src"目录下,并在文档中写明"。/configure"命令应该在那里运行,而不是在顶层目录中运行?否则你无法避免在顶层设置autoconf/automake文件