c++ - 调用 AC_PROG_CXX 后禁用对 libtool 的 cxx 支持

标签 c++ configure autotools automake libtool

对于我的项目(库),我使用带有 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

一些不相关的笔记

  1. 不要将生成的文件(Makefile.inconfigure 等)放入源代码管理。

  2. 添加一个 bootstrap 脚本来调用 autotools 来生成东西。

  3. 优先使用 pkg-config(即 PKG_CHECK_MODULES(SDL2, sdl2))而不是手工制作的 autoconf 宏(即 AM_PATH_SDL2);

  4. 不要安装自动 header (即 SDLU_config.h.in)。它使您的库与每个基于 autoconf 的软件不兼容,因为您正在重新定义 PACKAGEVERSION 和所有库检测宏。参见 my answer in this question有关如何操作的示例。

  5. 我会将 C++ API 作为独立的可选库构建和安装;完全删除 sdlu-config 脚本,然后编写需要 sdlusdluxx.pc。不要费心检查 C++ 编译器是否工作,如果用户通过 --enable-cxx 他知道他在做什么;我宁愿让构建失败也不愿静静地拥有一个不完整的库。

关于c++ - 调用 AC_PROG_CXX 后禁用对 libtool 的 cxx 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20741878/

相关文章:

c++ - 有没有Visual Studio 2008 运行时版本的总结?

php - C++ OOP 和 PHP OOP 之间的差异

c++ - C++ 中的 Typedef 枚举

编译 xkbcomp (Xorg App)

c++ - 设置菜单 UI 实现

c - Autoconf 问题 : “error: C compiler cannot create executables”

java - 从文件配置 ehcache

ubuntu - Ubuntu 13.10 哪个开发包有ndir.h?

c - 学习如何使用 GNU Autotools 打包我的程序时遇到问题

linux - autoconf/configure.ac中如果AC_CHECK_HEADER失败,如何为不同的平台指定不同的反馈?