【问题标题】:Disabling cxx support for libtool after calling AC_PROG_CXX调用 AC_PROG_CXX 后禁用 cxx 对 libtool 的支持
【发布时间】:2023-03-11 00:11:01
【问题描述】:

对于我的项目(库),我使用 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 is never defined”之类的错误,这对我来说似乎是合乎逻辑的。最糟糕的是,在 configure 运行时该错误未显示,但它在链接阶段稍后出现,以“未知 libtool 选项-o”的形式出现(哎哟)。

完整的源代码可以在这里找到 -> http://bitbucket.org/sdlu/sdlu/src

有人可以帮帮我吗?

提前谢谢...

【问题讨论】:

    标签: c++ configure autotools automake libtool


    【解决方案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
    

    一些不相关的注释

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

    2. 添加一个bootstrap 脚本,调用自动工具来生成东西。

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

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

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

    【讨论】:

    • 感谢您的回复,第一个解决方法(更改 LINK 命令)对我来说非常有效。至于笔记:
    • 1-2:我选择添加生成的文件是为了避免不同版本的自动工具不兼容的常见问题3:这些宏在内部使用 pkg-config 并回退到适当的脚本 (sdl2-config) 4:这已在最新版本中修复,感谢您注意 5:我想避免这种情况并仅将其用作最后的手段,主要是因为我还维护基于 CMake 和 premake 的构建系统。再次感谢!
    • 仍然,生成的文件不属于存储库。当您执行“make dist-gzip”来创建 tarball 时,所有内容都将被打包,因此用户不需要安装 autoconf/automake。我是 ODE 维护者之一,如果你想看看我们的 repo:sourceforge.net/p/opende/code/HEAD/tree/trunk
    • 我知道你在说什么,但是我对生成的 Makefile.in 进行了一点手工编辑,因此自动打包并不是一个真正的选择。另外,我更喜欢 tarball 中的存储库克隆,但话说回来,我更喜欢鸡蛋而不是培根……
    【解决方案2】:

    我认为干预 CXX 变量的处理不是一个好主意。

    使用您自己的变量 BUILD_CXX

    AC_CONDITIONAL([BUILD_CXX], [ test x$build_cxx = xyes ])here
    

    if BUILD_CXX
      # ....
    endif
    

    【讨论】:

    • 不,这不是问题...使用 CXX 作为条件名称非常有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多