2015-03-27 3 views
2

Я пытаюсь построить cmake, который использует две разные версии boost. (Я использую основу, которая работает только с повышением 1,55, но мои потребности приложений повысить 1,57)Используйте две разные версии boost

Моя идея состояла в том, чтобы сделать 2 Cmake строить процессы

Применение Cmake увеличить 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 ...) 

Framework 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(); 
} 

testVersion

#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 и inline мой callVersion Я получаю вывод:

Main call Using Boost 1.55.0 
library : 
Using Boost 1.55.0 

потому что использование компилятора для заголовков повышает уровень 1.55 только тогда, когда я включаю boost в исходные файлы, которые он занимает 1.57. Как я могу это решить? это возможно?


Заключение: мне нужен пустой заголовок:

all_boost_includes.hpp 

с all_boost_includes.cpp

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

, который только будет включать все заголовки подталкивания. И тогда я должен включить этот заголовок в каждый заголовок в моем приложении. Это верно?

Это похоже на предварительно скомпилированный заголовок форсунки или?

Я попытался включить «boost_headers.hpp», который является пустым и имеет boost_header.cpp, который включает в себя подталкивания версии

я добавил на моем CMake Применение ADD_LIBRARY (AppLib ШАРЕД boost_headers.cpp)

Но когда i try

#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 я получить неверные результаты

ответ

0

1. Если вы не встраивать callVersion

Компиляция библиотеки компилирует код для Version::callVersion в библиотеке. Поскольку библиотека использует boost 1.55 Version::callVersion вернет 1.55.

2. Если вы INLINE callVersion

Компиляция библиотеки не компиляции кода для Version::callVersion в библиотеке, потому что она будет bị встраиваемыми! Ваш Version::callVersion будет скомпилирован на стороне test. Как test использует повышение 1,57, Version::callVersion вернется 1.57

Заключение

Вы не должны встраивать вам звонить. Более того, вы не можете использовать классы, которые ссылаются на любой импульс в своих объявлениях в проектах приложений и библиотек, которые используют разные версии boost. Если вам нужно, вы должны подумать о создании каких-либо прокси-объектов или функций, так что все элементы boost будут инкапсулированы внутри вашей библиотеки.

+0

Спасибо, но я думаю, что вы смешали форсированную версию на тесте, когда я делаю inline, я получу 1.55, и если я не встроенный, я получу 1.57, но объяснение будет ясным. Я добавил что-то выше, это правильно? Предварительно скомпилированный заголовок boost в моем приложении? – Hunk

+0

@Hunk Если вы хотите использовать разные версии boost в приложении и библиотеке, вы должны избавиться от всех ссылок на boost в вашем API-интерфейсе библиотеки. Вы не должны включать _any_ boost в заголовки, которые будут включены как приложением, так и библиотекой, и вы не должны использовать _any_ boost функции или классы в заголовках, которые используются как приложением, так и библиотекой. – Lol4t0

+0

Хорошо спасибо, я не думаю, что это возможно, потому что у меня есть несколько typedefs, таких как boost :: shared_ptr FooPtr в заголовках, которые необходимы. Форвардная декларация невозможна по этому вопросу или? – Hunk