【问题标题】:Use two different Versions of boost使用两种不同版本的 boost
【发布时间】:2015-03-27 18:38:40
【问题描述】:

我尝试构建一个使用两个不同版本的 boost 的 cmake。 (我使用的框架仅在 boost 1.55 下运行,但我的应用程序需要 boost 1.57)

我的想法是制作 2 个 Cmake 构建过程

应用 Cmake boost 1.57

cmake_minimum_required (VERSION 2.6)
project (Application)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=auto -std=c++0x ")

set(Boost_DEBUG  ON)
set(Boost_NO_SYSTEM_PATHS TRUE)
set(BOOST_ROOT /opt/boost/boost_1_57)

find_package(Boost 1.57 REQUIRED COMPONENTS thread filesystem log system)

include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
SYSTEM /opt/boost/boost_1_57/include
)

ADD_LIBRARY( AppLib SHARED testVersion.cpp ...)

框架 Cmake 提升 1.55

cmake_minimum_required(VERSION 2.8.3)
project(Test)

add_subdirectory(Application)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=auto -std=c++0x ")

set(Boost_NO_SYSTEM_PATHS TRUE)
set(BOOST_ROOT $ENV{BOOST_ROOT})

find_package(Boost 1.55 REQUIRED COMPONENTS thread filesystem log system)

include_directories(
SYSTEM ${Boost_INCLUDE_DIRS}
)

add_executable(test test.cpp)
target_link_libraries( test AppLib )

test.cpp

#include "testVersion.hpp"

int main() {
    std::cout << "Main call Using Boost "
              << BOOST_VERSION / 100000     << "."  // major version
              << BOOST_VERSION / 100 % 1000 << "."  // minior version
              << BOOST_VERSION % 100                // patch level
              << std::endl;

    std::cout << "library : " << std::endl;
    Version v;
    v.callVersion();
}

测试版本

#include "testVersion.hpp"

void Version::callVersion()

{            std::cout << "Using Boost "
                      << BOOST_VERSION / 100000     << "."  // major version
                      << BOOST_VERSION / 100 % 1000 << "."  // minior version
                      << BOOST_VERSION % 100                // patch level
                      << std::endl;

    }

testVersion.hpp

#include <boost/version.hpp>
class Version
{
public:
    void callVersion();

};

如果我这样做,它运行良好: 输出:

Main call Using Boost 1.55.0
Using Boost 1.57.0

但是当我消除 testVersion.cpp 文件并内联我的 callVersion 时,我得到了输出:

Main call Using Boost 1.55.0
library : 
Using Boost 1.55.0

因为只有当我在源文件中包含 boost 时,编译器才使用 boost 1.55 的头文件,他采用 1.57。我该如何解决?这可能吗?


结论: 我需要一个空标题:

all_boost_includes.hpp

带有 all_boost_includes.cpp

#include "boost..."
#include ...

这将只包括所有提升标头。然后我必须在我的应用程序的每个标题中包含这个标题。对吗?

这类似于预编译的 boost header 还是?

我尝试包含“boost_headers.hpp”,它是空的,并且有一个 boost_header.cpp,其中包含增强版本

我在我的应用程序中添加了 cmake ADD_LIBRARY(AppLib SHARED boost_headers.cpp)

但是当我尝试时

#include "precompiled_boost.hpp"
#include <fstream>
#include <iostream>


class Version
{
public:
    void callVersion(){
        std::cout << "Using Boost "
                  << BOOST_VERSION / 100000     << "."  // major version
                  << BOOST_VERSION / 100 % 1000 << "."  // minior version
                  << BOOST_VERSION % 100                // patch level
                  << std::endl;
    }

};

他不知道 BOOST_VERSION。我必须在那里做什么?如果我包含 precompiled_boost.cpp 我得到错误的输出

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    1。如果不内联 callVersion

    编译库为库中的Version::callVersion 编译代码。由于库使用 boost 1.55 Version::callVersion 将返回 1.55

    2。如果你做内联 callVersion

    编译库编译库中Version::callVersion 的代码,因为它会双向内联!您的 Version::callVersion 实际上将在 test 端编译。由于test 使用boost 1.57,Version::callVersion 将返回1.57

    结论

    你不应该内联你的调用。此外,在使用不同版本的 boost 的应用程序和库项目中,您不能使用在其声明中引用任何 boost 的类。如果必须,您应该考虑创建一些代理对象或函数,以便将所有 boost 内容封装在您的库中。

    【讨论】:

    • 谢谢,但我认为你在测试时混合了 boost 版本,当我做内联时,我会得到 1.55,如果我不内联,我会得到 1.57,但解释很清楚。我在上面添加了一些内容对吗?我的应用程序中有预编译的 boost 标头?
    • @Hunk 如果你想在应用程序和库中使用不同版本的 boost,你应该去掉库 API 中的所有 boost 引用。您不应将 any boost 内容包含到应用程序和库都将包含的标头中,并且不应在两者都使用的标头中使用 any boost 函数或类应用程序和库。
    • 好的,谢谢,我认为这是不可能的,因为我在标题中有一些 typedef,如 boost::shared_ptr FooPtr 是必需的。在这一点上无法进行前向声明还是?
    • 可以进行转发声明,但您只能在库中使用转发声明的对象(不是指针)。这个想法是 boost_1.5.5::shared_ptr&lt;Foo&gt;boost_1.5.7::shared_ptr&lt;Foo&gt;完全不同的类。
    • @Lol4t0 "如果您想在应用程序和库中使用不同版本的 boost,您应该删除库中的所有 boost 引用 API。”为什么?能否请您为我详细解释一下?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多