【发布时间】:2013-08-18 10:33:07
【问题描述】:
我有一个中等的 C++ 项目。我正在尝试使用自动工具,但发现其复杂性不堪重负。
什么时候使用自动工具以及什么时候可以不用它?什么是(简单的)替代方案?
我想使用 autotools 的主要原因是它完全支持 make install。有没有更简单的替代方案?
理想情况下,我想要 Eclipse CDT 支持的东西。
【问题讨论】:
标签: c++ c linker makefile autotools
我有一个中等的 C++ 项目。我正在尝试使用自动工具,但发现其复杂性不堪重负。
什么时候使用自动工具以及什么时候可以不用它?什么是(简单的)替代方案?
我想使用 autotools 的主要原因是它完全支持 make install。有没有更简单的替代方案?
理想情况下,我想要 Eclipse CDT 支持的东西。
【问题讨论】:
标签: c++ c linker makefile autotools
对于make install 支持,您只需要automake。一个简单的Makefile.am 文件很容易制作:
LIBS += -lsome-lib -lsome_other_lib
bin_PROGRAMS = hello
noinst_HEADERS = some.h header.h files.h
hello_SOURCES = hello.c some.c other.c source.c file.c
就是这样。
如果您想让您的程序更加独立于平台,autoconf 工具非常有用。您编写一个简单的脚本来测试您使用的系统头文件和系统库是否存在。如果没有找到,您要么给出错误,要么使用包中提供的副本。
【讨论】:
LIBS 变量中,更新了我的示例。
noinst_HEADERS,头文件应该(理想情况下)列在hello_SOURCES中。
对于琐碎、自包含(无依赖、无需安装)、最多有 3 个源代码文件的项目,编写一个 Makefile:
.PHONY: all clean
all: program
clean:
rm -f *.o
program: sourceA.o sourceB.o
$(CXX) -o $@ $^ $(LDFLAGS)
您可以为 CPPFLAGS、CFLAGS、CXXFLAGS、LDFLAGS 定义变量,至少 GNU make 以预期的方式填充空白。
它当然没有解决依赖跟踪问题,也没有检查系统功能。非平凡项目的一个常见问题是与系统交互:确保某些库可用,以及安装/卸载。大多数工具在两者上都失败了。
这里有几个我有经验的例子:
它为不同的 IDE 生成一致的项目文件(如果您只需要构建代码,还可以生成 Makefiles)。不做任何其他事情(没有安装目标,无法检查库的可用性)。仅当您需要为不使用的 IDE 提供项目文件时才有用(例如,您使用 Eclipse 并且其他人想在 Visual Studio 上编译它)。任何重要的事情都需要 LUA 脚本。
如果您只需要调用编译器来处理您的文件,这是可以接受的。对于几乎任何事情,您都必须记住(或复制/粘贴)低级宏序列(形成某种编程语言)。在系统上查找库是复杂而混乱的(有些库得到了创建者的祝福,并且有硬编码的测试来找到它们,所以你可能很幸运)。考虑到到目前为止我必须处理的损坏的 cmake 脚本的数量,我认为大多数人只是复制/粘贴宏而不试图理解它。可以安装,但不能卸载。对于某些 cmake 脚本,您可能需要多次运行 cmake,直到它生成正确的输出(例如 VTK)。
似乎 CMAKE 和 Premake 做得更好:没有宏,使用著名的编程语言 (Python) 来提供大量有用的功能。在很多方面仍然失败;指定一个非硬编码的安装前缀需要不小的努力,因为它不是内置的。
远远超过上面提到的工具。其中大多数,方便。有健全的默认值;一些亮点:
AC_CHECK_LIB(foobar, function_to_check_linking) - 这会找到一个名为 foobar 的库,并将其放入 $LIBS 环境变量中。是的,检测库是一项重要的常见任务;如果您的工具不认为这是一流的用例,请放弃它。 (不过使用 PKG_CHECK_MODULES 更方便。)
./configure 期间的每个操作都记录在config.log 中,因此您实际上可以找出问题所在。对于大多数其他工具,您最多只能获得“Boost_dir-NOTFOUND”。
已经内置了make install,make uninstall(你的意思是什么,你的工具可以把东西放到我的系统上,但不能删除它们?),make check(如果你指定@ 987654331@ 程序),make dist-gzip(将源文件打包成 tar.gz),make distcheck(创建一个 tar.gz 并确保一切都正确构建并且所有测试都通过)。更好的是,它与 checkinstall 配合得很好,因此您可以从中创建和分发 .rpms 和 .debs。
如果需要,您可以在 automake Makefile 中混合使用旧的 Makefile 规则。
Autotools 文件与源文件一样被跟踪,因此如果需要,只需调用 make 即可再次生成帮助脚本和 Makefile。
是的,学习起来“很难”,但在我看来,只不过是学习在 CMAKE/SCons 中调用的所有特定宏/函数。项目的初始Makefile.am只是分配给变量的文件列表,初始configure.ac可以由autoscan生成;我发现即使是更琐碎的项目也很方便。
autobook 是我所知道的学习它的最佳来源,但不幸的是它已经过时了(autoconf 会抱怨很多关于使用已弃用的宏)。
【讨论】:
您可以选择要使用的自动工具部件。许多项目只使用autoconf,这是自动工具的一部分,它会生成configure 脚本,如果您只想生成带有install 目标的Makefile,并且可以由最终用户配置,那么这可能就是您的全部了需要。
【讨论】:
我不知道这是否离答案太远了,但我会考虑 scons。开始需要一点时间,但会自动完成许多必须使用 make 手动调侃的事情。
【讨论】: