Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用AC_PROG_cxx后禁用对libtool的cxx支持_C++_Configure_Autotools_Automake_Libtool - Fatal编程技术网

C++ 调用AC_PROG_cxx后禁用对libtool的cxx支持

C++ 调用AC_PROG_cxx后禁用对libtool的cxx支持,c++,configure,autotools,automake,libtool,C++,Configure,Autotools,Automake,Libtool,对于我的项目(库),我使用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], [

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

但是,当配置不能定位G++时(实际上这会杀死C++扩展的额外逻辑),整个事情就不起作用了。经过一些研究,我得出结论,AcxPrimulcxx不知怎么告诉LIbToover假定C++支持。我还惊讶地意识到,如果AC_PROG_CXX失败,它会将CXX设置为“g++”

无论如何,有条件地调用AC_PROG_CXX会产生错误,如“am_fastdepCXX从未定义”,这在我看来是合乎逻辑的。最糟糕的是,configure运行时没有显示错误,但它会在链接阶段稍后出现,形式为“未知libtool选项
-o
”(哎哟)

完整的源代码可以在这里找到->

有人能帮我吗


提前感谢…

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

使用您自己的变量BUILD\u CXX

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


这是一个汽车制造商的限制,它不关心的条件时,选择链接器

解决方法之一是有条件地重写_LINK命令,如中所述:

另一种方法(在同一讨论中建议)是将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
    脚本,该脚本调用自动工具生成内容

  • 与手工制作的autoconf宏(即
    AM\u PATH\u SDL2
    )相比,更喜欢pkg配置(即
    pkg\u检查模块(SDL2,SDL2)

  • 不要安装自动头文件(即中的SDLU_config.h.)。当您重新定义
    版本
    ,以及所有库检测宏时,它会使您的库与所有基于autoconf的软件不兼容。有关如何执行此操作的示例,请参见

  • > p>我将把C++ API建和安装成一个独立的、可选的库;完全删除sdlu配置脚本,然后编写需要sdlu的
    sdluxx.pc
    。不要麻烦检查C++编译器是否工作,如果用户通过<代码>启用CXX/CONT>他知道他在做什么;我宁愿构建失败,也不愿默默地拥有一个不完整的库


    不,这不是问题所在。。。使用CXX作为条件名称非常有效谢谢您的回复,第一个解决方法(更改LINK命令)对我非常有效。至于注释:1-2:我选择添加生成的文件是为了避免autotools不同不兼容版本的常见问题3:这些宏在内部使用pkg config并回退到相应的脚本(sdl2 config)4:这在最新版本中已修复,感谢注意5:我希望避免这种情况,并将其作为最后手段使用,主要是因为我还维护基于CMake和premake的构建系统。再次感谢!不过,生成的文件不属于存储库。当您执行“makedistgzip”创建tarball时,所有内容都将打包,因此用户不需要安装autoconf/automake。我是ODE维护者之一,如果你想看看我们的repo:我知道你说什么,但我手工编辑生成的Makefile.in一点点,所以自动打包并不是一个真正的选项。另外,我更喜欢柏油球的克隆库,但话说回来,我更喜欢鸡蛋而不是培根。。。
    if USE_CXX
        cxx_sources = ...
    else
        cxx_sources =
        libSDLU_la_LINK = $(LINK) $(libSDLU_la_CFLAGS) $(libSDLU_la_LDFLAGS)
    endif
    
    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