对于我的项目(库),我使用带有 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
”的形式出现(哎哟)。
完整的源代码可以在这里找到 -> http://bitbucket.org/sdlu/sdlu/src
有人可以帮帮我吗?
提前致谢...
最佳答案
这是 Automake 的限制,它不关心选择链接器时的条件。
一种解决方法是有条件地重写 _LINK 命令,如 this mailing list post 中所建议的那样:
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
);不要安装自动 header (即
SDLU_config.h.in
)。它使您的库与每个基于 autoconf 的软件不兼容,因为您正在重新定义PACKAGE
、VERSION
和所有库检测宏。参见 my answer in this question有关如何操作的示例。我会将 C++ API 作为独立的可选库构建和安装;完全删除 sdlu-config 脚本,然后编写需要
sdlu
的sdluxx.pc
。不要费心检查 C++ 编译器是否工作,如果用户通过--enable-cxx
他知道他在做什么;我宁愿让构建失败也不愿静静地拥有一个不完整的库。
关于c++ - 调用 AC_PROG_CXX 后禁用对 libtool 的 cxx 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20741878/