我正在创建一个libgdata包含一些测试和未安装程序的库.我遇到的问题是,一旦我安装了一次库,程序似乎就会链接到已安装的版本,而不再是本地版本../src/libgdata.la.
什么可能导致这个?我做错了什么吗?
这是我的test/Makefile.am样子:
INCLUDES = -I$(top_srcdir)/src/ -I$(top_srcdir)/test/
# libapiutil contains all of our dependencies!
AM_CXXFLAGS = $(APIUTIL_CFLAGS)
AM_LDFLAGS = $(APIUTIL_LIBS)
LDADD = $(top_builddir)/src/libgdata.la
noinst_PROGRAMS = gdatacalendar gdatayoutube
gdatacalendar_SOURCES = gdatacalendar.cc
gdatayoutube_SOURCES = gdatayoutube.cc
TESTS = check_bare
check_PROGRAMS = $(TESTS)
check_bare_SOURCES = check_bare.cc
Run Code Online (Sandbox Code Playgroud)
(libapiutil是另一个库,它有一些帮助程序来处理libcurl和libxml ++)
因此,例如,如果我在没有安装任何东西的情况下运行测试,一切正常.我可以在本地进行更改,并立即通过这些程序获取.
如果我安装了这个程序包,这些程序就会编译(看起来它实际上看起来本身就是标题),但是一旦我运行该程序就会抱怨缺少符号.
据我所知,它基于make输出链接到新构建的库(../src/libgdata.la),所以我不确定为什么会发生这种情况.如果我删除已安装的文件,那么对src/*的本地更改就可以了.
我在下面包含了gdatacalendar的make输出.
g++ -DHAVE_CONFIG_H -I. -I.. -I../src/ -I../test/ -I/home/altern8/workspaces/4355/dev-install/include -I/usr/include/libxml++-2.6 -I/usr/lib/libxml++-2.6/include -I/usr/include/libxml2 -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -g -O2 -MT gdatacalendar.o -MD -MP -MF .deps/gdatacalendar.Tpo …Run Code Online (Sandbox Code Playgroud) 如果我编写一个库,并包含用于开发的头文件,并且具有src/Makefile.am如下所示:
AM_CFLAGS = -std=c99 -Wall -Werror -Os
lib_LTLIBRARIES = libmylibrary.la
libmylibrary_la_SOURCES = a.c b.c
include_HEADERS = a.h b.h
Run Code Online (Sandbox Code Playgroud)
一切都很好.然而,a.h和b.h被下直接安装/usr/include(或/usr/local/include).如何安装它们,在我的库特定的子目录中,例如/usr/include/mylibrary?
我需要根据库的存在有条件地编译一些代码.使用autoconf/automake似乎应该很容易,但我无法弄明白.
例如,如果存在PNG库,我想包含使用它的代码.我的configure.ac有:
AC_CHECK_LIB([png], [png_create_write_struct_2])
Run Code Online (Sandbox Code Playgroud)
我的Makefile.am有:
if USE_LIBPNG
libdev_la_SOURCES += png.c
endif
Run Code Online (Sandbox Code Playgroud)
(它将png.c添加到libdev的源列表中,以便进行编译).
像USE_LIBPNG这样的automake条件要求在configure.ac中定义条件,所以我需要:
AM_CONDITIONAL([USE_LIBPNG], [test SOMETHINGOROTHER])
Run Code Online (Sandbox Code Playgroud)
问题是,什么可以测试SOMETHINGOROTHER?AC_CHECK_LIB定义了什么,我可以测试?
AC_CHECK_LIB的默认行为是定义一个可以在源代码中使用的符号(在config.h中),但这对Makefile没有帮助,因为AM_CONDITIONAL需要shell测试
我尝试覆盖默认的AC_CHECK_LIB行为,如下所示:
AC_CHECK_LIB([png], [png_create_write_struct_2], [HAS_LIBPNG=1])
Run Code Online (Sandbox Code Playgroud)
之后我可以测试它:
AM_CONDITIONAL([USE_LIBPNG], [test "x$HAS_LIBPNG" = "x1"])
Run Code Online (Sandbox Code Playgroud)
这很丑陋,但适用于Makefile ...但是会产生一个新问题:因为它丢弃了原来的AC_CHECK_LIB行为,而且我不再在config.h中添加一个符号,这是我需要的.
我必须遗漏一些基本的东西,或者可能做错了.已经挖了几个小时,没有找到答案.
任何人?
我有一个目录/ src包含我的所有源文件,/ bin用于在运行make命令后存储所有二进制文件.该目录如下所示:
/BuildDirectory
- - /src
- - /bin
- - configure
- - Makefile.am
- - configure.ac
- - ...
Run Code Online (Sandbox Code Playgroud)
现在在Makefile.am中,我必须指定:
bin_PROGRAMS = bin/x bin/y bin/z bin/k ...
bin_x_SOURCES = src/x.cpp
bin_y_SOURCES = src/y.cpp
bin_z_SOURCES = src/z.cpp
Run Code Online (Sandbox Code Playgroud)
是否有任何变量可以帮助摆脱所有"bin /"和"src /"?例如,我只需指定:
$BIN = bin
$SRC = src
Run Code Online (Sandbox Code Playgroud)
他们将在正确的文件夹中查找正确的文件并将其编译到正确的位置.
谢谢
我可以找到的所有Debian打包示例都假设用户从上游构建重新打包,因此它解压缩源tar包,配置,重建和重新打包.我正在尝试为自己的库构建一个包,它是使用autotools构建的.我尝试了几种不同的方法,我最近的尝试看起来像这样:
DH_PACKAGE_NAME=`echo $(PACKAGE_NAME) | sed s/_/-/g`
dist-hook:
cd $(distdir) ; \
export DEBFULLNAME="Some One" ; \
export DEBEMAIL="someone@foo.com" ; \
echo -e "\n" | dh_make --copyright blank --library --native \
--packagename $(DH_PACKAGE_NAME)
mv $(distdir)/debian $(distdir)/DEBIAN
dpkg-deb --build $(distdir)
Run Code Online (Sandbox Code Playgroud)
为此dpkg-deb抱怨dh_makes控制文件.我有一个问题,解决方案更简单了吗?
我有一个Makefile.am,它将负责构建最终的应用程序二进制文件:
项目/ src目录/ Makefile.am
同样在src目录中的是一个名为ctrnn的子目录,它包含一个Makefile.am:
项目/ src目录/ ctrnn/Makefile.am
现在,ctrnn/Makefile.am应该只生成对象.o文件,其思想是顶级Makefile.am应该使用子目录ctrnn中生成的目标文件来构建二进制文件.
这是ctrnn/Makefile.am
project/src/Makefile.am
Run Code Online (Sandbox Code Playgroud)
基于这个Makefile.am文件,我想最终得到network.o和neuron.o.我使用automake等生成相应的Makefile,但是当我尝试然后执行make文件时,它没有做任何事情,只是说:
make:'all'无所事事
我知道为什么会这样,我需要指定构建目标.但是我如何在ctrnn/Makefile.am脚本中执行此操作,因为我不想构建需要bin_PROGRAMS但实际目标文件为network.o和neuron.o的二进制文件?
(注意,如果我确实指定了bin_PROGRAMS名称,它最终会抱怨对main的未定义引用).
我做错了什么?
谢谢,本.
我有一个项目可以基于一个定义生成两个不同的应用程序.
libfoo_la_CXXFLAGS = -DMYDEFINE
Run Code Online (Sandbox Code Playgroud)
我必须修改Makefile.am来设置这个定义,所以它不是自动的.
我可以通过configure命令以某种方式设置此定义吗?有没有其他方法可以使用autotools设置一个定义?
寻找autoconf和automake规则的一个很好的例子,用于构建使用协议缓冲区的项目,将protoc添加到构建过程的最佳方法是什么?
我最近学会了如何使用automake,我有点恼火,我的编译命令来自一堆:
g++ -O2 -Wall -c fileName.cpp
Run Code Online (Sandbox Code Playgroud)
对于一堆:
depbase=`echo src/Unit.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
g++ -DHAVE_CONFIG_H -I. -I./src -g -O2 -MT src/Unit.o -MD -MP -MF $depbase.Tpo -c -o src/Unit.o src/Unit.cpp &&\
mv -f $depbase.Tpo $depbase.Po
Run Code Online (Sandbox Code Playgroud)
有没有办法清理它?我通常可以轻松地选择警告信息,但现在要阅读的文字墙是3倍大且更奇怪.
我知道我的旗帜是什么,因此只需要为每个文件说"编译xxx.cpp"就完美了.
我是autotools的新手,并且遵循本教程.但我无法解决这个错误,
$ automake
configure.ac: error: no proper invocation of AM_INIT_AUTOMAKE was found.
..
Makefile.am: error: required file './depcomp' not found
..
/usr/share/automake-1.12/am/depend2.am: error: am__fastdepCC does not appear in AM_CONDITIONAL
..
/usr/share/automake-1.12/am/depend2.am: error: AMDEP does not appear in AM_CONDITIONAL
..
Run Code Online (Sandbox Code Playgroud)
我的configure.ac档案是
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE(hello,1.0)
AC_CONFIG_SRCDIR([config.h.in])
AM_CONFIG_HEADERS(config.h)
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for …Run Code Online (Sandbox Code Playgroud)