首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用两种不同版本的boost

使用两种不同版本的boost
EN

Stack Overflow用户
提问于 2015-03-27 09:54:43
回答 1查看 1.5K关注 0票数 2

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

我的想法是让两个Cmake构建过程

应用Cmake 1.57

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#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();
}

testVersion

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#include <boost/version.hpp>
class Version
{
public:
    void callVersion();

};

如果我这样做的话,它运行得很好:输出:

代码语言:javascript
运行
复制
Main call Using Boost 1.55.0
Using Boost 1.57.0

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

代码语言:javascript
运行
复制
Main call Using Boost 1.55.0
library : 
Using Boost 1.55.0

因为编译器只在源文件中包含boost 1.55时才使用头boost 1.55,所以他使用1.57。我怎么能解决这个问题?这有可能吗?

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

代码语言:javascript
运行
复制
all_boost_includes.hpp

有一个all_boost_includes.cpp

代码语言:javascript
运行
复制
#include "boost..."
#include ...

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

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

我尝试了包含"boost_headers.hpp“,它是空的,并且有一个包含boost版本的boost_header.cpp

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

但当我尝试

代码语言:javascript
运行
复制
#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,就会得到错误的输出

EN

回答 1

Stack Overflow用户

发布于 2015-03-27 10:08:57

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内容都将封装在库中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29297788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档