我想要一个像这样的项目目录:
app/ | src/ Makefile
所有.cpp和.hpp,.h文件都在src
子目录中。如何配置Makefile.am
或configure.ac
以使用目录/src
生成的Makefile作为源目录?以及如何将生成的可执行文件放入指定的目录,如/usr/opt
?
另一个问题是,如果我想将我的程序设为.so库,如何实现我的目标,使其安装到/usr/lib
或/usr/local/lib
?以及如何将头文件设置为/usr/local/include/app
?
答案 0 :(得分:1)
通常,对于可执行文件,您可以使用以下内容:
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
将在/ usr / local / lib中安装lib。
答案 1 :(得分:1)
通常,您只需添加
SUBDIRS = src
到toplevel 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中安装的问题表明存在根本性的误解。在构建包时,你绝对不在乎。作为软件包维护者,你指出程序应该安装在$(前缀)/ bin(或$ exec_prefix / bin,或$ bindir)中,并且库应该在$ libdir中,但用户确定$ prefix的位置和运行configure时$ libdir和$ bindir。 (通常,人们只设置前缀,bindir默认为$ prefix / bin,而libdir默认为$ prefix / lib。)
答案 2 :(得分:0)
将autoconf和automake文件 configure.ac 和 Makefile.am 放在“src”目录中,并在文档中写入“./configure”命令应该在那里而不是在顶级目录中运行?否则你无法避免在顶级至少拥有一些autoconf / automake文件。