Я пытаюсь построить 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 я получить неверные результаты
Спасибо, но я думаю, что вы смешали форсированную версию на тесте, когда я делаю inline, я получу 1.55, и если я не встроенный, я получу 1.57, но объяснение будет ясным. Я добавил что-то выше, это правильно? Предварительно скомпилированный заголовок boost в моем приложении? – Hunk
@Hunk Если вы хотите использовать разные версии boost в приложении и библиотеке, вы должны избавиться от всех ссылок на boost в вашем API-интерфейсе библиотеки. Вы не должны включать _any_ boost в заголовки, которые будут включены как приложением, так и библиотекой, и вы не должны использовать _any_ boost функции или классы в заголовках, которые используются как приложением, так и библиотекой. – Lol4t0
Хорошо спасибо, я не думаю, что это возможно, потому что у меня есть несколько typedefs, таких как boost :: shared_ptr FooPtr в заголовках, которые необходимы. Форвардная декларация невозможна по этому вопросу или? –
Hunk