Ale*_*x F 5 c++ linux gcc boost binary-compatibility
我想用来自Linux标准库http://www.linuxfoundation.org/collaborate/workgroups/lsb的 LSB C++编译器构建我的程序.程序取决于使用gcc 4.4版本构建的Boost库.编译失败.是否可以使用LSB C++编译器构建Boost库?或者,是否可以使用一些旧的gcc版本构建Boost库,建议使用什么版本?我的最终目标是让我的可执行文件和第三方Boost库在大多数Linux发行版上运行.
通常,可以采取哪些措施来获得更好的Linux发行版二进制兼容性,根据Boost库开发C++闭源应用程序?
我最近打电话要这样做,如果它对其他人有用,这些是我遵循的步骤:
cd /opt/boost/boost_<version>
./bootstrap.sh --prefix=/opt/boost --without-libraries=python,mpi --without-icu
Run Code Online (Sandbox Code Playgroud)
/opt/boost/boost_<version>/project-config.jam并添加该行using gcc : : /opt/lsb/bin/lsbc++ : <cflags>-U_GNU_SOURCE <cxxflags>-U_GNU_SOURCE ;
Run Code Online (Sandbox Code Playgroud)
靠近文件顶部.请注意,如果您在其他一个文件中有一个using声明bjam从中读取其配置,则会失败,您可以通过它--debug-configuration来了解它正在读取哪些文件.
./bjam cflags=-fPIC cxxflags=-fPIC linkflags=-fPIC install
Run Code Online (Sandbox Code Playgroud)
我没有尝试让python或MPI库工作,也没有尝试让ICU使用boost.regex库.后者可能是使用LSB工具集构建ICU库的静态版本的情况.
-fPIC对于32位Linux来说,这不是必需的,但如果要将静态库链接到64位Linux的共享库,则需要它.
最终结果应该是二进制文件/opt/boost/lib和标题/opt/boost/include,显然您可以修改前缀以适合您自己的首选项.在将所有代码移植到LSB之前,我还有很多工作要做,所以我无法报告认证过程的进展情况.
LSB C++ 编译器实际上并不是编译器。可执行文件lsbc++是安装在您的系统上的 GCC 编译器的包装器(实际的编译器可以通过选项控制--lsb-cxx)。您很可能会侵入 boost 构建系统,让它调用 LSB 包装器而不是本机gcc编译器。
因此,可能出现的问题很可能不是 LSB 编译器无法编译语言结构,而是存在一些链接问题。
例如,LSB 编译器默认会丢弃代码所链接的任何共享库,除非它们属于 LSB。如果 BOOST 依赖于此类库,这可能会导致链接错误。这可以通过环境变量进行控制LSBCC_SHAREDLIBS,但您应该确保将这些库与您的产品一起提供。
另一个问题是 LSB 落后于 GCC 编译器版本(并且 BOOST 可能会爬进编译器的所有黑暗角落)。据我所知,GCC 4.4还没有经过充分的测试,所以你最好用4.3编译器尝试一下。
Google 似乎没有找到任何与使用 LSBCC 构建 boost 相关的内容,因此,如果您设法做到这一点,请分享您的经验,例如,作为您自己对问题的答案。