使用两种不同版本的boost

时间:2015-03-27 09:54:44

标签: c++ boost

我尝试构建一个使用两个不同版本的boost的cmake。 (我使用的框架只能使用boost 1.55运行,但我的应用程序需要提升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时,编译器才会使用标题提升1.55。我怎么解决这个问题?那可能吗?


结论: 我需要一个空头:

all_boost_includes.hpp

使用all_boost_includes.cpp

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

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

这类似于预编译的boost标头或?

我尝试过包含&#34; boost_headers.hpp&#34;这是空的并且有一个boost_header.cpp,其中包括boost版本

我添加了我的应用程序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,我得到错误的输出

1 个答案:

答案 0 :(得分:0)

1。如果你没有内联callVersion

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

2。如果你进行内联callVersion

编译库不会编译库中Version::callVersion的代码,因为它将是双内联的!您的Version::callVersion实际上会在test方面进行编译。由于test使用了提升1.57,Version::callVersion将返回1.57

结论

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