如何正确使用 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
).
中的适当位置
实用程序库方法在以下任一情况下最有意义
- 您的构建系统是递归的,或者
- 您想从同一来源构建多个目标。
对于问题中出现的 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 来源优先。
我希望将 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
).
实用程序库方法在以下任一情况下最有意义
- 您的构建系统是递归的,或者
- 您想从同一来源构建多个目标。
对于问题中出现的 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 来源优先。