C++ 调用AC_PROG_cxx后禁用对libtool的cxx支持
对于我的项目(库),我使用configure with libtool和automake在linux主机下构建。该库由一个C API和一个可选的C++扩展组成。那么,自从 AC_PROG_CXX必须全局调用,我使用automake条件: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.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
脚本,该脚本调用自动工具生成内容AM\u PATH\u SDL2
)相比,更喜欢pkg配置(即pkg\u检查模块(SDL2,SDL2)
)包
,版本
,以及所有库检测宏时,它会使您的库与所有基于autoconf的软件不兼容。有关如何执行此操作的示例,请参见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