我正准备第一次进入JNI(Java Native Interface)世界,提供从平台特定的C/C++代码到Java的文件系统更改通知.这是除非有人建议一些出色的库,因为我错过了这个.
作为JNI的新手我已经设法在它的接口端和它的库生成方面找到了很多文档,但是我没有找到很多关于构建本机库的知识.
我已经有一个基于ant的现有版本用于预先存在的Java源代码,所以我正在尝试研究如果我应该使用ant调用make来创建库,或者如果最好让make在创建后调用ant图书馆?
这两个选项都没有跳出来非常好,但两者似乎都比试图让ant调用编译器来编译代码并直接生成库更好.
我有一个C++ autoconf托管项目,我正在适应在FreeBSD主机上编译.最初的系统是Linux,所以我做了一个AM_CONDITIONAL来区分我正在构建的主机并将代码分成系统特定的文件.
configure.ac
AC_CANONICAL_HOST
AM_CONDITIONAL([IS_FREEBSD],false)
case $host in
*free*)
AC_DEFINE([IS_FREEBSD],[1],[FreeBSD Host])
AM_CONDITIONAL([IS_FREEBSD],true)
BP_ADD_LDFLAG([-L/usr/local/lib])
;;
esac
Makefile.am
lib_LTLIBRARIES=mylib.la
mylib_la_SOURCES=a.cpp \
b.cpp
if IS_FREEBSD
mylib_la_SOURCES+=freebsd/c.cpp
else
mylib_la_SOURCES+=linux/c.cpp
endif
当我运行automake时,它失败了这种消息:
Makefile.am: object `c.lo' created by `linux/c.cpp' and `freebsd/c.cpp'
有关如何配置automake以尊重此条件的任何想法,即使在Makefile.in构建过程中也是如此?
如果文件有不同的名称,我这是有效的,但它是c ++代码,我试图保持文件名与类名相同.
提前致谢!
我想创建一个Makefile.am文件,生成文件中提到的一个头xxx.c文件.
假设xxx.c包含:
#include <version.h>
...
Run Code Online (Sandbox Code Playgroud)
并且我有一条规则在最后创建它Makefile.am:
version.h:
echo '#define VERSION "'`hg id`'"' > version.h.tmp
cmp version.h.tmp version.h || mv version.h.tmp version.h
Run Code Online (Sandbox Code Playgroud)
我需要更改以使xxx.c编译依赖于version.h什么?我试过了nodist_progname_SOURCES=version.h,但似乎没有这样做.
尝试使用automake/autoconf(分别为1.10和2.61版本).一切都运行正常,除了automake没有生成Makefile.in.
产生了一些警告,但我认为它们并不重要.然而,最后一行让我觉得它产生的东西应该不会停在那里.项目中有一个md5.cc和md5.c文件.
xanadu:fsd wwilliam$ automake --add-missing
configure.ac:46: warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
/var/tmp/autoconf/autoconf-15~193/SRC/autoconf/lib/autoconf/specific.m4:421: AC_USE_SYSTEM_EXTENSIONS is expanded from...
/var/tmp/autoconf/autoconf-15~193/SRC/autoconf/lib/autoconf/functions.m4:1677: AC_FUNC_STRNLEN is expanded from...
configure.ac:46: the top level
configure.ac:46: warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
configure.ac:46: warning: AC_COMPILE_IFELSE was called before AC_GNU_SOURCE
/var/tmp/autoconf/autoconf-15~193/SRC/autoconf/lib/autoconf/specific.m4:340: AC_GNU_SOURCE is expanded from...
configure.ac:46: warning: AC_RUN_IFELSE was called before AC_GNU_SOURCE
configure.ac:46: warning: AC_COMPILE_IFELSE was called before AC_AIX
/var/tmp/autoconf/autoconf-15~193/SRC/autoconf/lib/autoconf/specific.m4:455: AC_AIX is expanded from...
configure.ac:46: warning: AC_RUN_IFELSE was called before AC_AIX
configure.ac:46: warning: AC_COMPILE_IFELSE was called before AC_MINIX
/var/tmp/autoconf/autoconf-15~193/SRC/autoconf/lib/autoconf/specific.m4:474: …Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的项目:
(dev dir)
- README
- INSTALL
/ src
- blah.cpp
- blah.hpp
/ conf
- blah_one.xml
- blah_two.xml
Run Code Online (Sandbox Code Playgroud)
我创建了一个configure.ac和Makefile.am来在(/ usr/local)/ bin下安装二进制文件.configure.ac是这样的:
AC_INIT([blah], [0.1])
AC_PREREQ([2.67])
AM_INIT_AUTOMAKE([1.11])
AC_CONFIG_SRCDIR([src/blah.cpp])
AC_PROG_CXX
AC_LANG([C++])
AC_HEADER_STDC
AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([src/Makefile])
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)
...... Makefile就像
SUBDIRS = src
Run Code Online (Sandbox Code Playgroud)
...和src/Makefile.am类似
bin_PROGRAMS = blah
blah_SOURCES = blah.cpp blah.hpp
Run Code Online (Sandbox Code Playgroud)
一切正常,"make install"正确安装(/ usr/local)/ bin下的二进制文件.
现在:
我想扩展这些命令"make install"(在configure,build之后),在/ etc/blah下安装配置文件blah_one.xml和blah_two.xml,并在/ var/log下"准备"一个日志目录/废话/
这样做的正确方法是什么?
有没有办法告诉automake不要解释部分Makefile.am?
具体来说,我试图在Makefile.am中编码Makefile条件.正如其他人注意到的那样,这不起作用,因为automake解释了endif结构.
有没有办法逃脱或引用Makefile.am文件中的字符串,以便automake逐字复制到目标Makefile?具体来说,我不希望它在以下内容中解释endif:
ifeq "$(SOMEVAR)" ""
SOMEVAR="default_value"
endif
Run Code Online (Sandbox Code Playgroud) 在我的Makefile.am文件中,我有这样的事情:
bin_PROGRAMS = foo bar
foo_SOURCES = foo.cpp
bar_SOURCES = bar.cpp
Run Code Online (Sandbox Code Playgroud)
我有兴趣bar只在我做的make bar时候编译,而不是在我做的时候make all.但我想要foo总是编译.我怎么做?
谢谢.
我想将相同的LDADD属性(单元测试库)设置为大量目标(单元测试C ++文件)。我首先尽管可能是automake具有AM_LDADD变量来将该库添加到文件中的所有目标,但事实并非如此。在一些邮件列表中,我发现了一些简短的讨论,要求添加它:http : //gnu-automake.7480.n7.nabble.com/AM-LIBS-AM-LDADD-td3698.html
我的问题是,您如何处理?有什么方法可以避免手动将LDADD属性添加到每个目标?
到目前为止,我的Makefile.am看起来像:
test1_SOURCES = ...
test1_LDADD = -llibrary
...
...
test20_SOURCES = ...
test20_LDADD = -llibrary
Run Code Online (Sandbox Code Playgroud) 我正在维护一个autoconf软件包,并希望集成自动测试.我使用Boost Unit Test Framework我的单元测试,并能够成功地将其集成到包中.
也就是说它可以通过编译make check,但是没有运行(尽管我读过它们make check都编译并运行测试).结果,我必须在构建繁琐的测试后手动运行它.
Makefile.am 在test文件夹中看起来像这样:
check_PROGRAMS = prog_test
prog_test_SOURCES = test_main.cpp ../src/class1.cpp class1_test.cpp class2.cpp ../src/class2_test.cpp ../src/class3.cpp ../src/class4.cpp
prog_test_LDADD = $(BOOST_FILESYSTEM_LIB) $(BOOST_SYSTEM_LIB) $(BOOST_UNIT_TEST_FRAMEWORK_LIB)
Run Code Online (Sandbox Code Playgroud)
Makefile.am 在根文件夹中:
SUBDIRS = src test
dist_doc_DATA = README
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
Run Code Online (Sandbox Code Playgroud)
运行test/prog产生输出:
Running 4 test cases...
*** No errors detected
Run Code Online (Sandbox Code Playgroud)
(我不认为你需要我的测试用例的内容才能回答我的问题,所以我现在省略了它们)
那么我怎样才能automake在每次跑步时运行我的测试make check?
automake autoconf unit-testing makefile boost-unit-test-framework
您可能知道,Bionic是Google用来运行Android应用程序的C库.有人在Linux机器上进行编译,因此可以在Android之外轻松使用.这是最近一次努力的代码,最初称为Gentoo-bionic.原始项目是基于Gentoo的,但目前的来源不是Gentoo特有的.我正在使用Ubuntu.这是代码:
https://github.com/gentoobionic/bionic
这是关于ELC2013的介绍:
我试图在X86_64 Ubuntu上编译它,但失败了.我试过了:
./autogen.sh
./configure
Run Code Online (Sandbox Code Playgroud)
我有:
configure: error: unsupported host cpu x86_64
Run Code Online (Sandbox Code Playgroud)
所以我尝试过:
./configure --build=arm-linux --target=arm-linux --host=arm-linux
Run Code Online (Sandbox Code Playgroud)
配置很好,但我得到:
$ make
make: *** No rule to make target `libc/arch-x86/include/machine/cpu-features.h',
needed by `all-am'. Stop.
Run Code Online (Sandbox Code Playgroud)
是否有人可以建议解决方法?
automake ×10
makefile ×5
autoconf ×3
unit-testing ×2
android ×1
ant ×1
autotools ×1
bionic ×1
c++ ×1
compilation ×1
dependencies ×1
gnu-make ×1
header-files ×1
java ×1
libtool ×1
ubuntu ×1