给出一些源文件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的例子吗?
我正在尝试设置一个使用libtool库和exectuable混合的automake项目,而且我很难熟悉automake文档,尤其是.与告诉编译器链接相关.
因此,有人可以解释之间的差异LDADD和LIBADD?
像:
-lname_of_library样式值与直接文件名等.每当我尝试阅读相关文档时,似乎它假定我知道我不知道的事情.
我想知道如何设置默认的编译器/链接器/等.标志,如果我使用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.这有效,但后来我无法覆盖它.我已经安装了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配置为查找?
我有一个项目有几个源目录:
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全局设置编译标志但是找不到关于如何使用这些宏的文档(你有指向这样的文档的指针吗?).
提前致谢
我最近觉得有必要学习构建工具.我正在通过StackOverflow寻找建议,而Gnu Make几乎没有被提及.相反,我看到Ant,Maven,CMake,Scon和其他许多人.然而,当我看到我有时需要编译的小"流氓来源"(如在非回购中)时,他们都需要这些make && make install步骤.
学习是否比学习另一种工具更省钱?
如果是这样,为什么Make仍然如此受欢迎?
我正在使用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我跑的时候会被执行 …
运行后,make distcheck我收到消息说我已经成功构建了包并准备好分发.如果我的解压tar.gz用tar -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的问题并且仍然存在同样的问题.
任何想法可能是什么问题?
我有一个数据目录,我想自动生成安装和卸载目标.基本上,我只想将这个目录逐字复制到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的理由,但所有可能的原因都不适用于此.
我正在开发一个使用autoconf&的C++项目,automake我正在努力正确设置包含路径*CPPFLAGS.我已经阅读了大约3个小时的文件,我还想不通.我不是在寻找黑客,而是寻找正确的方法.这是我的难题.
在我看来,包含路径有3个完全不同的来源:
configure --with-XXX=<PATH>.#include <file.h>即使file.h是包的一部分也使用,所以为了编译它们,我必须正确设置包含路径.(注意,它不是编辑所有这些文件的选项.)CPPFLAGS.在我目前的设置中:
configure.ac通过AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>").Makefile.am通过test_CPPFLAGS = -I<path>.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?还有其他"正确"的解决方案吗?