C 编写makefile的初学者;检查我的Makefile
我试图理解如何为小项目编写自己的makefile,所以我有几个问题 我的项目包括C 编写makefile的初学者;检查我的Makefile,c,makefile,linker,flags,automake,C,Makefile,Linker,Flags,Automake,我试图理解如何为小项目编写自己的makefile,所以我有几个问题 我的项目包括src目录,其中包含main.c,file1.c,file2.c,header1.h,最后是header2.h这些文件使用了我创建的非标准库和非标准头文件中的一些库,库目录位于usr/lib/pr\u lib中,头目录位于usr/include/lib 因此我应该创建两个makefile.am一个位于src目录,另一个位于项目的根目录makefile.am目录的src如下所示: program_NAME := PR
src
目录,其中包含main.c
,file1.c
,file2.c
,header1.h
,最后是header2.h
这些文件使用了我创建的非标准库和非标准头文件中的一些库,库目录位于usr/lib/pr\u lib
中,头目录位于usr/include/lib
因此我应该创建两个
makefile.am
一个位于src
目录,另一个位于项目的根目录makefile.am
目录的src
如下所示:
program_NAME := PRDSL
bin_PROGRAMS = PRDSL_AutoProject
program_INCLUDE_DIRS := /usr/bin/PR__bin
program_LIBRARY_DIRS := /usr/lib/PR__lib
CFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
program_LIBRARIES := \
libprdependency \
libprdynarray_pic \
libprhistogram_pic \
libprlistofarrays \
libprlistofarrays_pic \
libprmalloc \
libvreo_wrapper_library
AM_LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
AM_LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))
PRDSL_AutoProject_SOURCES = \
main.c \
file1.c \
file2.c
depend :
makedepend --$(CFLAGS) --$(PRDSL_AutoProject_SOURCES)
all: $(program_NAME)
SUBDIRS = src
PRDSL_AutoProjectdocdir = ${prefix}/doc/PRDSL_AutoProject
PRDSL_AutoProjectdoc_DATA = \
README\
COPYING\
AUTHORS\
ChangeLog\
INSTALL\
NEWS
INTLTOOL_FILES = intltool-extract.in \
intltool-merge.in \
intltool-update.in
EXTRA_DIST = $(PRDSL_AutoProjectdoc_DATA) \
$(INTLTOOL_FILES)
DISTCLEANFILES = intltool-extract \
intltool-merge \
intltool-update \
po/.intltool-merge-cache
# Remove doc directory on uninstall
uninstall-local:
-rm -r $(PRDSL_AutoProjectdocdir)
根目录下的第二个makefile.am
如下所示:
program_NAME := PRDSL
bin_PROGRAMS = PRDSL_AutoProject
program_INCLUDE_DIRS := /usr/bin/PR__bin
program_LIBRARY_DIRS := /usr/lib/PR__lib
CFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
program_LIBRARIES := \
libprdependency \
libprdynarray_pic \
libprhistogram_pic \
libprlistofarrays \
libprlistofarrays_pic \
libprmalloc \
libvreo_wrapper_library
AM_LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
AM_LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))
PRDSL_AutoProject_SOURCES = \
main.c \
file1.c \
file2.c
depend :
makedepend --$(CFLAGS) --$(PRDSL_AutoProject_SOURCES)
all: $(program_NAME)
SUBDIRS = src
PRDSL_AutoProjectdocdir = ${prefix}/doc/PRDSL_AutoProject
PRDSL_AutoProjectdoc_DATA = \
README\
COPYING\
AUTHORS\
ChangeLog\
INSTALL\
NEWS
INTLTOOL_FILES = intltool-extract.in \
intltool-merge.in \
intltool-update.in
EXTRA_DIST = $(PRDSL_AutoProjectdoc_DATA) \
$(INTLTOOL_FILES)
DISTCLEANFILES = intltool-extract \
intltool-merge \
intltool-update \
po/.intltool-merge-cache
# Remove doc directory on uninstall
uninstall-local:
-rm -r $(PRDSL_AutoProjectdocdir)
但我在运行automake
命令时收到以下错误和警告:
src/Makefile.am:20: error: 'program_LIBRARIES' is used but 'programdir' is undefined
src/Makefile.am:18: warning: 'CFLAGS' is a user variable, you should not override it;
src/Makefile.am:18: use 'AM_CFLAGS' instead
src/Makefile.am:43: error: AM_LDFLAGS must be set with '=' before using '+='
任何人都可以查看它并帮助我吗?对于
src/Makefile.am:43:错误:在使用“+=”之前,必须将am\u LDFLAGS设置为“=”
请查看您的设置
是的,以下几行告诉您使用AM\u CFLAGS
而不是CFLAGS
,因为正如错误所示,CFLAGS
是用户指定的值,您应该不使用它
src/Makefile.am:18: warning: 'CFLAGS' is a user variable, you should not override it;
src/Makefile.am:18: use 'AM_CFLAGS' instead
我相信,虽然我还不确定,您获取
src/Makefile.am:20:error的原因是:使用了“program_LIBRARIES”,但未定义“programdir”
,因为您使用的是变量program_LIBRARIES
,autotools认为这是一个他们应该使用的变量,但您不是以这种方式使用的,而是在设置AM\u LDFLAGS
的值。因此,假设我是正确的,如果您将其重命名为不遵循autotool变量命名方案,我相信错误会消失。您没有在您的计算机上得到关于该错误的答案吗?@EtanReisner不幸的是,它不能解决我的错误:(@EtanReisner我试图重新安装automake并对其进行升级,但出现了相同的错误,我使用此命令升级了“sudo apt get upgrade automake”?@EtanReisner我拥有的automake版本是automake(GNU automake)1.14.1我想它已经更新了,我会在另一个问题中写一个反馈,但我在这里要求对整个makefile.am和另一个错误“src/makefile.am:20:error:‘使用了program_库’,但‘programdir’没有定义”我想你可能正在用你的许多(真正好的)重新发明轮子问题。自动工具对开发人员不友好;它们是[结束]用户友好。通过教程学习是值得的——即使正确地做简单的事情也需要大量的前期知识。对于开发人员来说,自动工具的这一高障碍是最令人沮丧的。我将程序库重命名为程序库lib2,不再抱怨这个错误,但它在执行make时给了我一个新的错误来自终端的命令:(但我会将你的答案标记为正确答案,因为它解决了上述问题。真的谢谢,如果你想帮助我,我可以在这里发布新的错误吗?你可以将其作为评论发布在这里,但我可能会告诉你提交一个关于它的新问题,假设它不是立即无关紧要的。它抱怨库,让所有的ake[1]:进入目录/home/sara/NetBeansProjects/PRDSL\u AutoProject'在src make[2]中制作所有内容:正在输入目录
/home/sara/NetBeansProjects/PRDSL_AutoProject/src'CCLD PRDSL_AutoProject../libtool:line 5986:cd:libprdependency:没有这样的文件或目录libtool:link:无法确定'libprdependency'make的绝对目录名[2]:***[PRDSL_AutoProject]错误1您认为使用动态和静态库并将它们包含在同一makefile变量中可能是问题的原因吗?不,我认为这可能与手动尝试链接有关,但我不确定。请使用更新的makefile.am和新的错误消息提出新问题。此外,您还应该真正修复depend
根据我在前面的问题中对其所做的评论确定目标配方。