我有一个具有以下结构的 C 项目
Main/
Makefile.am
bin/
src/
Makefile.am
main.c
SomeLibrarySource/
SomeFuncs.c
SomeFuncs.h
main.c 包含使用 SomeFuncs。{h / c} 文件中定义的函数的main函数。
我想在这个项目中使用autotools。我在autotools上阅读了几个资源。但是,我只能使用autotools
来管理单个级别的项目,其中所有源,对象和其他文件都位于同一目录中。
然后我得到了一些关于使用autotools进行像这样的深度项目的链接,然后我感到困惑。
现在我有两个Makefile.am如下
Makefile.am
SUBDIRS=src
的src / Makefile.am
mainprgdir=../
mainprg_PROGRAMS=main
main_SOURCES=main.c
我很确定这些文件不应该像我现在拥有的那样:P
如何将 autotools 用于上述项目结构? (至少在那些 Makefile.am
(s)应该存在什么,以及我应该在哪里放置它们。
编辑: 还有一件事!最后,我想在 bin 目录中创建目标文件。
由于
答案 0 :(得分:2)
mainprogdir=../
没有多大意义(你不知道它与安装有什么关系)。可能是有意的:
# Main/Makefile.am
# .━━ target for `make install`
# |
# ↓ ↓━━ target for compilation
bin_PROGRAMS = bin/main
# ↓━━ based upon compilation target name
bin_main_SOURCES = src/main.c
答案 1 :(得分:1)
主要有两种方法。如果SomeLibrarySource中的函数仅由main使用,则不需要构建单独的库,只需在src / Makefile.am中指定源文件
main_SOURCES = main.c SomeLibrarySource/SomeFuncs.c
但是,如果你真的想在树中的其他代码中使用这些函数,你不想多次编译SomeFuncs.c但是应该使用一个便利库。
# Assigning main_SOURCES is redundant
main_SOURCES = main.c
main_LDADD = SomeLibrarySource/libSomeFuncs.a
noinst_LIBRARIES = SomeLibrarySource/libSomeFuncs.a
AM_CPPFLAGS = -I$(srcdir)/SomeLibrarySource
(您需要在configure.ac中使用AC_PROG_RANLIB才能使用便捷库。)
如果源文件名为SomeFuncs.c,则automake不需要Makefile.am指定SomeLibrarySource_libSomeFuncs_a_SOURCES
,但如果源代码文件的名称与noinst_LIBRARIES
中指定的名称不匹配,{{1应该设置为用于构建库的文件列表。请注意,您不需要指定main_SOURCES,因为如果不指定main.c是默认值(但是显式并不是一个坏主意。)(在所有这些中,我不习惯使用CamlCase名称,但系统我正在使用一个不区分大小写的文件系统(苹果有史以来最大的错误),我在这里给出的例子正在为我工作.YMMV)
您当然可以进行递归制作,或者将库构建为单独的项目并进行安装。 (我喜欢最终选项。具有有用功能的库本身应该存在。)