我只想用自动生成的 auto(make/conf/...) 东西在 linux 中开发一个 C 应用程序。我尝试用 ede 和 anjuta 生成它,但它似乎没有生成 Makefile.am。所以,我尝试运行 automake,它说找不到“ltmain.sh”。是否有一些易于为 linux C/C++ 应用程序生成基本构建文件的方法。什么是标准做法?大多数人自己编写这些文件吗?
谁能告诉我是否有办法向 Makefile.am 插入条件块,以便将其进一步传递给由 autotools 创建的 Makfile?
下面是一个例子:
ifeq "$(SOMEVAR)" ""
SOMEVAR="default_value"
endif
Run Code Online (Sandbox Code Playgroud)
这似乎是做有条件的事情的常见 Makefile 方式。Automake 切断 endif 行并最终失败并显示如下消息:
Makefile:390: *缺少‘endif’。停止。
有什么想法吗?
如何告诉 Automake 构建一个不需要安装的动态模块?
pkglib_LTLIBRARIES = mywrapper.la
mywrapper_la_LDFLAGS = -no-undefined -module -avoid-version
Run Code Online (Sandbox Code Playgroud)
导致 mywrapper.so 安装到pkglibdir.
noinst_LTLIBRARIES = mywrapper.la
mywrapper_la_LDFLAGS = -no-undefined -module -avoid-version
Run Code Online (Sandbox Code Playgroud)
导致改为构建静态便利库。
有问题的动态模块仅用于运行测试套件,因此不能分发。
我正在开发一个静态C库,并且一直在使用一个简单的Makefile.我们现在不得不支持异地安装等等,现在是时候采用更强大的构建标准了.我真的希望它是autotools - 我喜欢GNU Build System的自动一致性,我也发现它非常容易使用.
那就是说,我有一个问题.
以下是项目结构的概述:
project/
common/
pkg/
inc/
src/
submodule1/
some_thing/
some_other_thing/
submodule2/
. . .
Run Code Online (Sandbox Code Playgroud)
common包含将安装在目标系统上的头文件 - 一个直接在常见下的头文件,以及一些其他共同的东西/ pkg.(好吧,这不是真的PKG,这只是一个例子.)一切都在common为.h.
inc包含严格与实现相关的内部包含文件,不应公开.一切都在inc为.h.
src为每个子模块都有一个目录,每个子模块可以分成或不分成几个子分段(子模块,如果你愿意的话).一切都在src为.c.
原始makefile将设置一个SOURCES变量,该变量由.c在src中递归发现的每个文件组成,添加-I./common -I./inc,构建目标文件,并将它们存档到库中.非常直截了当.
好吧,有了automake,它似乎并不那么简单.我想到了为构建目标添加标志,例如`project_CPPFLAGS = -I./ inc -I./common" - 这解决了部分问题,但我觉得我做错了什么,不知何故.
有了那些(次优的?)设置,我可以建立和连接图书馆,这已经足够令人兴奋,但我在这里的真正原因是make install.
common如果愿意,包含库的公共接口.需要构建源,但也需要安装.如果我包含它project/,那么automake会看到类似common/thing.h和common/pkg/other.h的路径,并includedir在安装时弄错路径.我想把它递归到那个目录来构建一个只有安装头的项目,但这不仅闻起来很糟糕,而且在我尝试它时它不起作用.库头需要一个特定的树结构 - 如何维护lib头树结构,使它们可用于所有源文件,并根据它们安装它们common?
另外,是否有一些更优雅的方式来处理包含而不是强制-I?我知道我必须指定它们HEADERS以便将它们放入分发包中,但实际上这似乎并不能使它们被包括在内,让我有点迷失.
我觉得automake(也许是一般的GNU)期待我的项目的一些结构,我只是没有看到. …
我有一个autotools管理的项目(此处为sscce tar.gz包),具有以下结构:
我configure.ac是:
AC_INIT([foo], [1.0], [foo@bar.ba])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)
我Makefile.am是:
bin_PROGRAMS = main
main_SOURCES = main.c foo.c foo.h
Run Code Online (Sandbox Code Playgroud)
它编译和运行完美......但后来我注意到我的Makefile.am不正确.它声明我的主要代码依赖foo.h,但真正的文件是foo/foo.h.我改变了它,编译按预期工作,就像之前一样:
bin_PROGRAMS = main
main_SOURCES = main.c foo.c foo/foo.h
Run Code Online (Sandbox Code Playgroud)
然而,它让我想知道:当依赖关系错误时它是如何工作的?它工作得很好,我甚foo/foo.h至可以编辑并make重新编译依赖文件.实际上,我甚至可以从依赖项中删除头文件...
bin_PROGRAMS = main
main_SOURCES = main.c foo.c
Run Code Online (Sandbox Code Playgroud)
...它仍将被扫描,会触发重新编译相关文件.
所以,我的问题是:
Makefile知道foo/foo.h在make调用期间要分析的依赖项?main_SOURCES变量吗?make在第一种情况下不应该失败,因为我声明一个不存在的文件是一个依赖项?如何告诉automake使用名称中带有空格的文件?这似乎不起作用.
bin_PROGRAMS = prog
prog_SOURCES = "a file.c" "another file.c"
Run Code Online (Sandbox Code Playgroud) 我在https://github.com/Habbie/autoyacc-problem上发布了一个存储库来演示我的问题。
在 automake 1.11 及以下版本中,AC_PROG_YACC在 configure.ac 和AM_YFLAGS=-dMakefile.am 中使用,parser.yy 将变成 parser.cc 和 parser.h。使用 automake 1.12,我得到 parser.cc 和 parser.hh。因为 mybin.cc 有include "parser.h",这意味着 1.12 破坏了我的构建。
我感觉这是一个向后不兼容的更改,但我觉得应该有一种理智的方法来处理这个问题。
展示:
git clone https://github.com/Habbie/autoyacc-problem.git
cd autoyacc-problem/
autoreconf -i
./configure
make
Run Code Online (Sandbox Code Playgroud)
automake 1.11 的结果:mybin 被构建。automake 1.12 的结果:
mybin.cc:1:20: error: parser.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
帮助!
注意:本示例中没有实际的 C++ 代码,但对于我的实际问题,我确实需要 g++。
首先,我只是想说,我是Autotools的新手.
我有一个具有以下结构的项目:
+-src
+-commands
Makefile.am
+-copy
Makefile.am
copy.h
copy.cpp
+-delete
Makefile.am
delete.h
delete.cpp
main.cpp
Makefile.am
Makefile.am
Run Code Online (Sandbox Code Playgroud)
Makefile.am有SUBDIRS = src
src/Makefile.am有SUBDIRS =命令.
src/commands/Makefile.am有SUBDIRS = $(AUTODIRS)
当我在root中运行automake时,它会生成Makefile.in和src/Makefile.in,但不会生成命令和副本.
我究竟做错了什么?
我目前正在开发一个依赖于递归automake进行构建的C++项目.我想构建一个共享库,并Makefile.am在库的src目录中看起来像
# ...
# Library name
lib_LTLIBRARIES = libadapter-@MY_API_VERSION@.la
# Sources
libadapter_@MY_API_VERSION@_la_SOURCES = \
$(top_builddir)/src/sourceA.cpp \
$(top_builddir)/src/sourceB.cpp
# ...
Run Code Online (Sandbox Code Playgroud)
自1.14版本,automake的问题时,警告subdir-objects未指定的选项AM_INIT_AUTOMAKE中configure.ac.但是,添加该subdir-objects选项似乎打破了构建过程,make抱怨丢失的.Plo文件.我已经在网上搜索了遇到类似问题的人,但没有找到任何合理的提示,如何在不将项目更改为非递归项的情况下解决问题.任何帮助是极大的赞赏.
编辑:
更深入地探讨这个问题,我注意到./configure创建了一个目录,名称$(top_builddir)在库的当前源目录下面,该目录包含.Plo构建库所需的所有文件.在Makefile,但是,我发现.Plo我的库源当量(sourceA.cpp和sourceB.cpp在本例中)由前缀include $(top_builddir)/src/$(DEPDIR)/和$(top_builddir)被定义为一个变量的相对(即,路径../../../src/.deps/).现在很清楚为什么make找不到.Plo文件,因为它搜索错误的目录.这看起来像bug #16375的可能重复.任何解决方法?
编辑2:
在网络上进一步挖掘,揭示了另外两个线程来解决这个问题:#1327和automake-bug.一个已知的解决方法似乎是将--disable-dependency-tracking选项传递给./configure.至少对我来说它有效.
我是GNU autotools的新手,在我尝试的项目中,./configure它会产生以下错误:
./configure: line 9852: syntax error near unexpected token `luajit,'
./configure: line 9852: ` PKG_CHECK_MODULES(luajit, luajit,LLUAJIT="yes",LLUAJIT="no")'
Run Code Online (Sandbox Code Playgroud)
在Configure.in中:
PKG_CHECK_MODULES(luajit, luajit,LLUAJIT="yes",LLUAJIT="no")
if test "x$LLUAJIT" = "xyes"; then
CONFIGFLAGS="$CONFIGFLAGS -DHAVE_LIBLUAJIT"
LUA_CFLAGS="$luajit_CFLAGS"
LUA_LIBS="$luajit_LIBS"
AC_SUBST(LUA_CFLAGS)
AC_SUBST(LUA_LIBS)
if test "x$macos" != "xno"; then
LDFLAGS="${LDFLAGS} -pagezero_size 10000 -image_base 100000000"
fi
else
echo
echo " ERROR! LuaJIT library not found. For better performance, go get it from"
echo " http://www.luajit.org/."
AC_MSG_ERROR("Fatal!")
fi
Run Code Online (Sandbox Code Playgroud)
似乎autoconf(也许)无法找到PKG_CHECK_MODULES宏。我在Internet上搜索了解决方案,发现这是因为libtool未安装。重新安装后libtool,错误仍然存在。
希望有人认识到问题并迅速解决,希望能得到您的帮助。