我有c ++代码需要在编译之前完成它的sed.我该如何插入Makefile.am?
我尝试了典型的makefile设置,目标似乎不存在:
gentest.cc:
$(SED) -i "s|FIND|REPLACE|" gentest.cc
如果你对我为什么要这样做感兴趣,那是因为我slider3.py在python中编写了我的程序(),而我的伙伴用c ++(gentest.cc)写了他的,并且他需要调用我的.我正在通过编辑argv然后使用来完成此操作execv().
... {
char **argv2 = new char*[argc];
memset(argv2,0,sizeof(argv2));
argv2[0] = "__PREFIX__/bin/slider3.py";
memcpy(argv2 + 1, argv + 2, sizeof(char *) * (argc - 2));
int oranges = execv(argv2[0], argv2);
printf("%s\n", strerror(oranges));
return oranges;
} ...
我已经处理了#!添加到slider3.py并chmod +x使用不起作用的方法gentest.cc.我还处理了添加slider3.py到已安装的文件列表.
EXTRA_DIST=testite.sh slider3_base.py
bin_SCRIPTS = slider3.py
CLEANFILES = $(bin_SCRIPTS)
slider3.py: slider3_base.py
rm -f slider3.py
echo …
编辑:修改我的问题
在C中构建外部PHP模块时,如何链接共享对象?
对于我正在开发的一个小项目,我一直在通过命令行使用简单的编译.然而,随着它变大,我决定学习并使用autoconf和automake来编译它.
经过一些配置,我成功使用automake构建.但是我注意到输出二进制文件的大小比通过命令行使用g ++大.我尝试使用静态和动态库,结果是一样的.
我也尝试过一个简单的hello世界,而且使用automake比使用命令行编译更大.
所以,我试图运行objdump -h:命令行编译返回27个部分,另一方面,automake编译返回相同的27个部分加上7个部分,称为debug_aranges,debug_info,debug_abbrev,debug_line,debug_loc,debug_ranges.所以我显然认为它与调试有关.
因此,任何人都知道这些部分是什么,如果它们是必要的以及如何摆脱那么所以可执行文件更小以便分发.
我刚刚安装了MacPorts并发出了命令:
sudo port install automake
Run Code Online (Sandbox Code Playgroud)
在整个过程中,我看到了这样的信息:
Warning: Deactivate forced. Proceeding despite dependencies.
Run Code Online (Sandbox Code Playgroud)
这是什么意思?为什么会这样?它是否至关重要,如果是的话,我该怎么做呢?
谢谢,gb
我正在尝试编写一个使用autotools构建的程序,但是当我尝试制作它时遇到了问题.Automake似乎依赖于一个名为depcomp的文件.我想知道这个文件做了什么,以及我应该填写什么/我应该怎么做.
我正在从事一个自动工具项目,并且是自动工具领域的新手。由于种种原因,为了完整起见,在底部进行了详细说明,我有一个Shell脚本,我想从中获取输出以用于我的makefile。
我有类似以下情况。Autoconf从AC_CONFIG_FILES命令生成脚本。例如
AC_CONFIG_FILES([thescript], [chmod +x thescript])
Run Code Online (Sandbox Code Playgroud)
主题
#!/bin/sh
# -*- sh -*-
# @configure_input@
echo @abs_top_builddir@/bar/foo
Run Code Online (Sandbox Code Playgroud)
我真正想要做的是使用@abs_top_builddir@/bar/fooMakefile中返回的任何内容。我想在make时使该值在变量中可用,并且能够在我的Makefile.am中访问它,例如$(FOOPLACE)。我该如何实现?
我需要此/额外信息的原因
这个问题与我的先前的问题有关:
如何获取autoconf configure.ac中顶级构建目录的绝对路径?
该项目需要一个子项目,该子项目具有自己的makefile和configure.ac。子项目是一个程序,用于为主项目生成源文件。有一个选项可以禁用此项目的构建,并尝试使用已安装的版本。在这种情况下,变量FOOPLACE(uisng AC_PATH_PROG)中提供了已安装版本的位置。当我使用本地构建的版本时,我想FOOPLACE改用它的位置。然后,该变量在Makefile.am中用作$(FOOPLACE)。
似乎autoconf中存在一个错误,这意味着可以访问abs_top_builddir的唯一位置是在配置时生成的配置文件中AC_CONFIG_FILES。在链接的问题中有我为什么要这样做的详细信息。
我是一个autotools初学者,我似乎无法弄清楚如何使用autotools正确使用外部库.
这是我的目录层次结构.
.
??? configure.ac
??? Makefile.am
??? README
??? src
(source files)
??? Makefile.am
Run Code Online (Sandbox Code Playgroud)
acml_mp默认情况下,库的名称是和/opt/acml5.3.1/gfortran64/lib.还有一个名为/opt/acml5.3.1/gfortran64/includeinclude 的目录.当我没有autotools编译时,包括通常的编译器标志工作正常:
g++ ... -L/opt/acml5.3.1/gfortran64_mp/lib -I/opt/acml5.3.1/gfortran64_mp/include -lacml_mp ...
Run Code Online (Sandbox Code Playgroud)
在configure.ac中,我输入了AC_LIB_LINKFLAGS([acml_mp])我认为只处理-lacml_mp标志的命令.
基本上,最终目标是对此库进行autoconf搜索,并使automake生成的makefile在编译时包含正确的链接/包含路径.最后,在手动编译时,我总是需要LD_LIBRARY_PATH使用命令修改环境变量
Export LD_LIBRARY_PATH=/opt/acml5.3.1/gfortran64_mp/lib:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想避免让用户这样做.抱歉,如果这些信息已经存在,我通过SO和Google查看了几个小时无济于事.
我在C++项目中使用来自ffmpeg的libavcodec和libavformat库.链接-lavcodec -lavformat与g ++编译器工作正常,但是当我尝试使用在automake项目中编译的相同代码时,我不确定出了什么问题.
工作正常:
g++ -o test -D__STDC_CONSTANT_MACROS -lavcodec -lavformat test.cpp
Run Code Online (Sandbox Code Playgroud)
不工作Makefile.am:
binaryname_LDFLAGS= -lavcodec -lavformat
Run Code Online (Sandbox Code Playgroud)
错误:
....
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function
ff_nut_add_sp: error: undefined reference to 'av_tree_node_size'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function
ff_nut_add_sp: error: undefined reference to 'av_tree_insert'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function
ff_nut_free_sp: error: undefined reference to 'av_tree_enumerate'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function
ff_nut_free_sp: error: undefined reference to 'av_tree_destroy'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(rtp.o):function
ff_rtp_get_payload_type: error: undefined reference to 'av_opt_get_int'
...
Run Code Online (Sandbox Code Playgroud)
也没工作:
LDFLAGS=...-lavcodec -lavformat
Run Code Online (Sandbox Code Playgroud)
错误:
src/dsp/audioDecoder.cpp:99: error: undefined reference to 'av_register_all'
src/dsp/audioDecoder.cpp:101: error: undefined reference to 'avcodec_find_decoder'
src/dsp/audioDecoder.cpp:109: error: undefined reference to 'avcodec_alloc_context'
src/dsp/audioDecoder.cpp:120: error: undefined reference to …Run Code Online (Sandbox Code Playgroud) 我想知道AM_LDFLAGS和LDFLAGS之间有什么区别,因为我遇到了一个错误
error: AM_LDFLAGS must be set with '=' before using '+='
Run Code Online (Sandbox Code Playgroud)
当我在foreach循环中使用AM_LDFLAGS时,我的make文件代码如下所示:
program_INCLUDE_DIRS := /usr/bin/PR__bin
program_LIBRARY_DIRS := /usr/lib/PR__lib
CFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
AM_LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
Run Code Online (Sandbox Code Playgroud) 我遇到了一个与automake有关的问题,我似乎无法找到一个干净的解决方案,看起来它应该是可能的(甚至简单),但没有什么简单的工作.
基本上我遇到的问题是源文件包含自动生成的头文件.我可以添加依赖项来生成头文件只是文件,一旦标题存在,一切正常,因为automake的自动依赖生成处理所有事情.问题是第一次在干净的树中运行make时,依赖文件不存在,因此automake不知道生成头文件,这使得包含头的文件的编译失败而不产生任何依赖.这是一个鸡蛋问题 - 你需要手动告诉(自动)make来构建头文件.
显而易见的解决方案是在头文件的Makefile.am文件中添加依赖项,但这不起作用,因为对目标的依赖关系会覆盖automake的自动规则生成,正如文档所说:
请注意,Automake不会区分具有命令的规则和仅指定依赖关系的规则.因此,如果不重新定义整个规则,则无法将新的依赖项附加到automake定义的目标.
现在我通过"隐藏"来自automake的依赖来解决这个问题,但这仅适用于GNU-make:
Makefile.am:
bin_PROGRAMS = foo
foo_SOURCES = main.c foobar.c baz.c
gen.h: system.spec
...command to regen gen.h
# foobar.c #includes gen.h, so it needs to exist prior to compiling foobar.c
$(eval foo-foobar.o: gen.h)
Run Code Online (Sandbox Code Playgroud)
这样做,但看起来很难看.是否有更好的自动安全方式来做到这一点?