使用自动工具构建系统/在单独的“构建”目录中构建

Posted

技术标签:

【中文标题】使用自动工具构建系统/在单独的“构建”目录中构建【英文标题】:Using autotools build system / Building in a separate 'build' directory 【发布时间】:2012-09-10 09:23:08 【问题描述】:

我正在创建一个软件项目,我想使用 autotools 为我生成 makefile 等脚本,我手动创建了 Makefile.am 和 configure.in 文件,我正在使用 autogen.sh 脚本来自here。尝试在单独的“构建”目录中构建项目时出现问题,例如如果我去:

mkdir build
cd build
../configure
make

配置步骤工作正常,但运行 make 我得到:

make  all-recursive
Making all in src
/bin/sh: line 0: cd: src: No such file or directory
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

有什么技巧可以让它工作吗?或者我应该放弃并尝试一些更简单/不同的东西。 我计划这是一个相当简单的 C++ 项目,我计划拥有的唯一依赖项是在 boost 单元测试框架上,并在 Eclipse IDE 中进行大部分开发。

【问题讨论】:

这似乎是您的 Makefile.am 的问题。如果您可以发布它们会很棒(至少 Makefile.am 在您项目的根目录和 src 中(假设 src/ 直接在项目根目录中) 对不起.. 他们是gist.github.com/3690227 【参考方案1】:

你的src/Makefile.am 有一个错误,第 17 行:

swin-adventure_SOURCES = src/main.cc

真的应该读:

swin-adventure_SOURCES = main.cc

因为您已经在 src/ 目录中(除非有 src/src/ 子文件夹)

还有另一个错误,因为您在 _SOURCES 变量中使用了特殊字符:swin-adventure_SOURCES 具有禁止的 - 字符;尝试将其标准化为swin_adventure_SOURCES

最后,您尝试多次为bin_PROGRAMS 分配一个值(并且每次都是相同的值),请尽量避免这种情况。

类似:

## Additional flags to pass to aclocal when it is invoked automatically at
## make time. The $ACLOCAL_FLAGS variable is picked up from the environment
## to provide a way for the user to supply additional arguments.
ACLOCAL_AMFLAGS = $ACLOCAL_FLAGS

## Define an executable target "swin-adventure", which will be installed into the
## directory named by the predefined variable $(bindir).
bin_PROGRAMS = swin-adventure

## Define the list of source files for the "swin-adventure" target. The file 
## extension .cc is recognized by Automake, and causes it to produce rules 
## which invoke the C++ compiler to produce an object file (.o) from each 
## source file. The ## header files (.h) do not result in object files by 
## themselves, but will be included in distribution archives of the project.
swin_adventure_SOURCES = main.cc

【讨论】:

谢谢。你是一个真正的帮助。有没有办法移动生成的二进制文件的创建位置(即在根目录而不是 src 目录中创建它?) 通常你不会:-)。如果您绝对需要它位于根目录中,您可以将所有构建信息添加到您的根 Makefile.am(而不是 src/Makefile.am)中,这次使用 src/main.cc(这不是我们来的地方在?);或者您添加一个构建后挂钩,将生成的二进制文件复制/符号链接到您想要的位置

以上是关于使用自动工具构建系统/在单独的“构建”目录中构建的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 插件Gradle 自动化构建 ① ( Gradle 构建工具简介 | Gradle 构建工具用途 )

如何使用 autotool 在单独的目录中构建

自动构建部署

前端自动化构建工具

自动化构建工具Gulp基础使用指南

Maven知识梳理。