Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编写makefile的初学者;检查我的Makefile_C_Makefile_Linker_Flags_Automake - Fatal编程技术网

C 编写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

我试图理解如何为小项目编写自己的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 := 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
根据我在前面的问题中对其所做的评论确定目标配方。