如何正确使用 automake/autoconf 与子目录?

How to use automake/autoconf with subdirectories properly?

我希望将 automake 用于包含很多子目录的项目。我想要实现的是将所有子目录中的所有源代码编译到 linux.

上的一个可执行文件中

现在我正在使用子目录对象,我必须在其中为整个层次结构手动指定每个源代码文件的路径。

我曾尝试对每个子目录使用 Makefile.am 的 LTLIBRARIES 方法,但由于某种原因,该程序无法编译并给了我很多未定义的引用错误。

现在我的 Makefile.am 文件如下所示:

AUTOMAKE_OPTIONS = subdir-objects
bin_PROGRAMS = a.out
a_out_SOURCES = EntryPoint.cpp ./glad/src/glad.cpp ./ImageLoader/ImageLoader.cpp ./FileIO/FileIO.cpp ./Debug/DebugLog.cpp ./Object/Object.cpp \
./Texture/Texture.cpp ./Window/Window.cpp ./Shader/Shader.cpp
include_HEADERS = ./glad/include/glad/glad.h ./ImageLoader/stb_image.h ./FileIO/FileIO.h ./Debug/DebugLog.h ./Object/Object.h \
./Texture/Texture.h ./Window/Window.h ./Shader/Shader.h
a_out_LDADD = -lGLEW -lGL -lsfml-graphics -lsfml-window -lsfml-system -ldl -lglfw -lm

有更好的方法吗?

Right now I am using subdir-objects where I have to manually specify the paths of each of the source code files for the entire heirarchy.

在任何情况下,您都必须在某处单独指定每个源文件。

I had tried using LTLIBRARIES approach using Makefile.am for each of the subdirectories, but for some reason the program does not compile and gives me a lot of undefined reference errors.

我认为您是在谈论为每个子目录构建一个实用程序库。您没有提供与此尝试对应的 Makefile.am 文件,但您描述的未定义引用的最可能原因之一是您未能在 link 中包含所有实用程序库(通过将它们列在 a_out_LDADD).

中的适当位置

实用程序库方法在以下任一情况下最有意义

  1. 您的构建系统是递归的,或者
  2. 您想从同一来源构建多个目标。

对于问题中出现的 Makefile.am,这些都不是真的。它可以转换为递归的,但每个子目录中的资源很少,这对我来说似乎不值得。结果会更复杂,而不是更少,并且会因 top-level make 没有完整的依赖树来处理的问题而受到严重影响。

Is there a better way to do this?

呈现的 Makefile.am 类似于我将用于描述的源布局。我要进行的更改主要是风格上的:

AUTOMAKE_OPTIONS = subdir-objects

bin_PROGRAMS = a.out

a_out_SOURCES = \
  EntryPoint.cpp \
  Debug/DebugLog.cpp \
  Debug/DebugLog.h \
  FileIO/FileIO.cpp \
  FileIO/FileIO.h \
  glad/src/glad.cpp \
  glad/include/glad/glad.h \
  ImageLoader/ImageLoader.cpp \
  ImageLoader/stb_image.h \
  Object/Object.cpp \
  Object/Object.h \
  Shader/Shader.cpp \
  Shader/Shader.h \
  Texture/Texture.cpp \
  Texture/Texture.h \
  Window/Window.cpp \
  Window/Window.h
a_out_LDADD = -lGLEW -lGL -lsfml-graphics -lsfml-window -lsfml-system -ldl -lglfw -lm

其中一个语义变化是将 headers 从 include_HEADERS 移动到 a_out_SOURCES。从技术上讲,它们 不需要 专门列在程序源中,但这行得通,而且它们确实需要列在某个地方,以免它们在发行版中被遗漏。但是,它们不应列在 HEADERS 主目录中,因为这将导致它们被 make install 安装到系统中,并且这仅对 public headers 有意义] 图书馆。

没那么重要,将每个文件单独列在一行上,并对这些行进行排序,包括将 headers 放在相应来源的旁边,这样可以使来源列表更易于检查和维护。从路径中省略不必要的前导 ./ 有助于使这些条目更易于阅读,至少对我而言,但 current-directory 源和子目录源之间的区别是通过列出所有 current-directory 来源优先。