对于我的项目(库),我使用configure with libtool和automake在linux主机下构建。该库包含一个C API,以及一个可选的C ++扩展。所以,从那以后 必须全局调用AC_PROG_CXX,我使用automake条件:
*configure.ac*:
AC_PROG_CC
AC_PROG_CXX
AM_PROG_AR
LT_INIT
... some tests to figure out 'build_cxx' ...
AC_CONDITIONAL([CXX], [ test x$build_cxx = xyes ])
在Makefile.am里面
sources = files.c
if CXX then
cxx_sources = files.cpp
else
cxx_sources =
endif
sources = $sources $cxx_sources
然而,当configure无法定位g ++(实际上会杀死c ++扩展的额外逻辑)时,整个事情都不起作用。经过一些研究,我得出的结论是AC_PROG_CXX以某种方式告诉libtool假设c ++支持。我也很惊讶地发现,如果AC_PROG_CXX失败,它会将CXX设置为'g ++'!!!
无论如何,有条件地调用AC_PROG_CXX会产生类似'am_fastdepCXX永远不会定义'的错误,这对我来说似乎是合乎逻辑的。最糟糕的是配置运行时没有显示错误,但它会在链接阶段的后期出现,形成'未知的libtool选项-o
'(ouch)。
完整的源代码可以在这里找到 - > http://bitbucket.org/sdlu/sdlu/src
有人能帮助我吗?
提前致谢...
答案 0 :(得分:1)
这是一个Automake限制,它不关心选择链接器时的条件。
根据this mailing list post的建议,一个解决方法是有条件地重写_LINK命令:
if USE_CXX
cxx_sources = ...
else
cxx_sources =
libSDLU_la_LINK = $(LINK) $(libSDLU_la_CFLAGS) $(libSDLU_la_LDFLAGS)
endif
另一种方式(在同一讨论中提出)是将C ++源代码放入有条件构建和添加的实用程序库中,然后添加到主库中:
if CXX
noinst_LTLIBRARIES = libSDLUxx.la
libSDLUxx_la_SOURCES = src/cxx/SDLU_CButton.cxx \
src/cxx/SDLU_CIniHandler.cxx \
src/cxx/SDLU_CRenderer.cxx \
src/cxx/SDLU_CSprite.cxx \
src/cxx/SDLU_CTexture.cxx \
src/cxx/SDLU_CWindow.cxx
libSDLU_la_LIBADD = libSDLUxx.la
endif
请勿将生成的文件(Makefile.in
,configure
等)放入源代码管理中。
添加一个bootstrap
脚本,调用autotools来生成内容。
首选pkg-config(即PKG_CHECK_MODULES(SDL2, sdl2)
)通过手工制作的autoconf宏(即AM_PATH_SDL2
);
不要安装自动阅读器(即SDLU_config.h.in
)。当您重新定义PACKAGE
,VERSION
和所有库检测宏时,它会使您的库与每个基于autoconf的软件不兼容。有关如何操作的示例,请参阅my answer in this question。
我会将C ++ API构建并安装为独立的可选库;完全删除sdlu-config脚本,然后编写需要sdluxx.pc
的{{1}}。不要费心检查C ++编译器是否有效,如果用户通过sdlu
他知道他在做什么;我更喜欢让构建失败而不是默默拥有一个不完整的库。
答案 1 :(得分:0)
我认为干扰处理CXX变量不是一个好主意。
使用您自己的变量BUILD_CXX
AC_CONDITIONAL([BUILD_CXX], [ test x$build_cxx = xyes ])here
和
if BUILD_CXX
# ....
endif