【发布时间】: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 我得到错误的输出
【问题讨论】: