标签: automake

如何在automake脚本中创建共享库(.so)?

给出一些源文件test.cpp我想创建一个共享库libtest.so.我试图在automake文件的范围内这样做但是我似乎无法让它工作.

例如,在g ++下,我执行以下操作:

g++ -shared -fPIC test.cpp -o libtest.so
Run Code Online (Sandbox Code Playgroud)

然后我可以创建另一个依赖于共享库的文件,如下所示:

g++ mytest.cpp libtest.so -o blah
Run Code Online (Sandbox Code Playgroud)

我读过,automake只支持通过libtool创建共享库.我试图让我的automake scriupt工作如下,但它似乎永远不会产生.so.我得到的最接近的是生成.la和.o文件:

在configure.ac中:

AC_ENABLE_SHARED
AC_DISABLE_STATIC
AC_PROG_LIBTOOL(libtool)
Run Code Online (Sandbox Code Playgroud)

在Makefile.am中

lib_LTLIBRARIES=libtest.la
libtest_la_SOURCES=test.cpp
libtest_la_CFLAGS=-fPIC
libtest_la_CPPFLAGS=-fPIC
libtest_la_CXXFLAGS=-fPIC
libtest_la_LDFLAGS= -shared -fPIC
Run Code Online (Sandbox Code Playgroud)

有人能给我一个基于上述构建.so的例子吗?

c++ automake autotools shared-libraries

25
推荐指数
1
解决办法
2万
查看次数

LDADD和LIBADD有什么区别?

我正在尝试设置一个使用libtool库和exectuable混合的automake项目,而且我很难熟悉automake文档,尤其是.与告诉编译器链接相关.

因此,有人可以解释之间的差异LDADDLIBADD

像:

  • 何时使用另一个,
  • 哪一个采用-lname_of_library样式值与直接文件名等.

每当我尝试阅读相关文档时,似乎它假定我知道我不知道的事情.

c++ automake libtool

25
推荐指数
2
解决办法
2万
查看次数

使用Autotools的默认编译器标志

我想知道如何设置默认的编译器/链接器/等.标志,如果我使用Autoconf/Automake组合.

例如,如果我没有设置任何内容,则默认编译器标志为"-O2 -g".我可以用其他东西覆盖它,例如,如果我想调试:

./configure 'CXXFLAGS=-O0 -g'
Run Code Online (Sandbox Code Playgroud)

但我发现默认配置很愚蠢,因为如果我启用优化,调试将变得不可能.所以默认标志应该是"-O2"或"-O0 -g",如果我configure没有参数运行.我该怎么做?

编辑:我尝试了以下解决方案:

  • 放到progname_CXXFLAGS=whateverMakefile.am.它不起作用,因为它将标志添加到默认标志而不是替换它们.
  • 放入CXXFLAGS=whateverconfigure.ac.这有效,但后来我无法覆盖它.

automake autoconf makefile

24
推荐指数
3
解决办法
3万
查看次数

发现自动错误'./ltmain.sh'

我已经安装了mingw和msys mingw-get-setup.exe.我还安装了Autotools(autoconf,automake,m4,libtool)C:\/opt/autotools.

当我运行automake时,总会发生以下错误:

configure.ac:11: error: required file './ltmain.sh' not found
Run Code Online (Sandbox Code Playgroud)

如果我ltmain.sh从libtool的已安装树中复制,执行将正常完成.

如何在ltmain.sh不复制的情况下将automake配置为查找?

c automake autotools libtool mingw32

22
推荐指数
1
解决办法
2万
查看次数

Autotools:如何设置全局编译标志

我有一个项目有几个源目录:

src/A
   /B
   /C
Run Code Online (Sandbox Code Playgroud)

在每个中,Makefile.am包含

AM_CXXFLAGS = -fPIC -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)

如何避免在每个源文件夹中重复此操作?

我试图修改src/Makefile.am和configure.in,但没有成功.我以为我可以使用AC_PROG_CXX全局设置编译标志但是找不到关于如何使用这些宏的文档(你有指向这样的文档的指针吗?).

提前致谢

c++ flags automake autoconf autotools

19
推荐指数
1
解决办法
2万
查看次数

是否值得学习GNU Make?

我最近觉得有必要学习构建工具.我正在通过StackOverflow寻找建议,而Gnu Make几乎没有被提及.相反,我看到Ant,Maven,CMake,Scon和其他许多人.然而,当我看到我有时需要编译的小"流氓来源"(如在非回购中)时,他们都需要这些make && make install步骤.

学习是否比学习另一种工具更省钱?

如果是这样,为什么Make仍然如此受欢迎?

automake makefile

18
推荐指数
2
解决办法
2891
查看次数

autotools生成的tarball的用户收到错误消息:aclocal-1.13:找不到命令

我正在使用autoconf版本2.69生成的安装脚本分发tarball.适用于许多不同的机器.现在,在新的Arch Linux系统上工作的用户报告configure正确执行,但会make立即终止,并显示以下错误消息:

/home/user/project/build-aux/missing: line 81: aclocal-1.13: command not found
WARNING: 'aclocal-1.13' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [aclocal.m4] Error 127
Run Code Online (Sandbox Code Playgroud)

acinclude.m4项目目录中没有.用户确保他没有修改aclocal.m4,configure.ac文件m4/或项目中的任何其他内容.

错误信息对我来说没有意义:据我所知,aclocal我跑的时候会被执行 …

automake autoconf makefile m4 autoreconf

17
推荐指数
3
解决办法
3万
查看次数

Autotools - tar这看起来不像tar档案

运行后,make distcheck我收到消息说我已经成功构建了包并准备好分发.如果我的解压tar.gztar -zxvf hello-0.2.tar.gz它成功地提取它的所有内容.但是,当我尝试在不同的机器中提取它们时,我得到:

tar: This does not look like a tar archive
tar: Skipping to next header
tar: Exiting with failure status due to previous errors
Run Code Online (Sandbox Code Playgroud)

奇怪的是它以前工作过.

在我正在尝试构建软件包的机器上,我已经更新了我automake 1.10.1, autoconf 2.61, and tar 1.20 to automake 1.11.1, autoconf 2.65, and tar 1.23的问题并且仍然存在同样的问题.

任何想法可能是什么问题?

automake autoconf autotools tar

16
推荐指数
2
解决办法
3万
查看次数

使用automake安装包含大量文件的数据目录树

我有一个数据目录,我想自动生成安装和卸载目标.基本上,我只想将这个目录逐字复制到DATA目录,通常,我可能会单独列出所有文件,如

dist_whatever_DATA=dir/subdir/filea ...
Run Code Online (Sandbox Code Playgroud)

但是当我的目录结构看起来像这样时会出现问题

*root
 *subdir
  *~10 files
 *subdir
  *~10 files
 *subdir
  *~700 files
 *subdir
 ...
 ~20 subdirs
Run Code Online (Sandbox Code Playgroud)

我只是不能列出作为Makefile.am的一部分包含的所有1000多个文件.那太荒谬了.

我还需要保留目录结构.我应该注意,这些数据根本不是由构建过程生成的,实际上是很短的录音.因此,我不希望automake"检查"我想要安装的每个文件是否已经实际创建,因为它们是否存在,并且无论文件是什么,我知道我希望它安装,等等文件不是,不应该安装.我知道这是其他地方不使用通配符instsalls的理由,但所有可能的原因都不适用于此.

automake autoconf install autotools

15
推荐指数
2
解决办法
5612
查看次数

如何使用autotools设置包含路径

我正在开发一个使用autoconf&的C++项目,automake我正在努力正确设置包含路径*CPPFLAGS.我已经阅读了大约3个小时的文件,我还想不通.我不是在寻找黑客,而是寻找正确的方法.这是我的难题.

在我看来,包含路径有3个完全不同的来源:

  1. 必须与我的包一起安装的外部库,由我们配置configure --with-XXX=<PATH>.
  2. 在我的包中,一些源文件#include <file.h>即使file.h是包的一部分也使用,所以为了编译它们,我必须正确设置包含路径.(注意,它不是编辑所有这些文件的选项.)
  3. 异想天开(或不是)标准指定必须允许用户指定自己的(额外)包含路径.也就是说,我根本不应该设置CPPFLAGS.

在我目前的设置中:

  • 类型1路径设定内部configure.ac通过AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>").
  • 类型2路径设定内部Makefile.am通过test_CPPFLAGS = -I<path>.
  • 无法设置类型3.更确切地说,如果用户CPPFLAGS在运行之前设置,则会make覆盖类型1设置,从而导致编译失败.当然,用户可以尝试使用CXXFLAGS,但是那个用户有不同的用途(记住,我要求正确的方法来做到这一点,而不是黑客).

我尝试通过使用AM_CPPFLAGSinside 设置Type 1路径来解决这个问题configure.ac.(供参考:如果您设置AM_CPPFLAGS而不是CPPFLAGS,但仍需要运行某些检查AC_CHECK_HEADERS,则需要临时设置CPPFLAGS然后还原它以使检查起作用;这将在此处解释.)这样可以释放CPPFLAGS类型3路径,但不幸的是,编译失败,因为只有没有专门存在的情况下Makefile才会生成-s .因此,如果存在类型2路径,则编译将失败,因为它不会获得类型1路径.configureAM_CPPFLAGS<target>_CPPFLAGStest_CPPFLAGStest

修复方法是指定内部Makefile.am始终使用AM_CPPFLAGS.但这是"按书"吗?我可以以全局方式执行此操作,还是必须编辑每个单独的target_CPPFLAGS?还有其他"正确"的解决方案吗?

automake autoconf autotools include-path

15
推荐指数
1
解决办法
3万
查看次数