CMake find在同一台机器上同时升级x86和x64

问题描述:

Boost编译的库对于x86和x64具有相同的名称。我的项目使用升压,我想它会自动链接通过CMake编译针对x64或x86目标时,正确的Boost库CMake find在同一台机器上同时升级x86和x64

我CMakeFiles.txt采用简单的代码

find_package(Boost REQUIRED 
    COMPONENTS 
    coroutine context thread filesystem program_options system 
) 

我升压是建立与(MSVC2015)

b2 address-model=32 --build-type=minimal stage --stagedir stage 
b2 address-model=64 --build-type=minimal stage --stagedir stage64 

我也试图“安装”的目标,并把推动构建成单独的文件夹

我建立我的项目,(视窗)

md build32 
cd build32 
cmake .. -G"Visual Studio 14 2015" 
cmake --build . 
cd .. 

md build 
cb build 
cmake .. -G"Visual Studio 14 2015 Win64" 
cmake --build . 
cd .. 

x86的目标是打造全成,因为它的库(升压)正在铺设中是众所周知的CMake的FindBoost模块

但64目标着“舞台”文件夹因为FindBoost使用Boost的x86库进行构建过程,并且不尝试使用来自“stage64”的库,并出现此错误:

D:\lib\boost_1_61_0\stage\lib\libboost_coroutine-vc140-mt-gd-1_61.lib : warning LNK4272: library machine type 'X86' conflicts with target machine type 'x64'

我的目标是在“CMake的”以exlude任何额外PARAMS呼吁建立我的项目,我希望它自动为x86或x64取决于正确的升压库我使用

如何在其上的CMake的-G PARAM我可以更改我的CMakeFiles.txt以使其自动找到正确的提升库吗?

加速版本 - 1.61,MSVC 2015年,CMake的 - 3.6.2(最新的,并且具有约1.61提升知识),Windows 7的64位

+1

当为x86_64构建项目时,您可以将CMake变量'BOOST_ROOT'设置为approprite目录('D:\ lib \ boost_1_61_0 \ stage64')。 – Tsyvarev

+0

@Tsyvarev,不幸的是,boost阶段目录不包含仅包含libs。所以我需要将BOOST_ROOT设置为d:\ lib \ boost_1_61_0。但是,即使我将-DBOOST_LIBRARYDIR添加到d:\ lib \ boost_1_61_0 \ stage64 \ lib - 当我构建x64时,仍然使用不正确的d:\ lib \ boost_1_61_0 \ stage(x86)作为库。它以某种方式硬编码在CMake的findboost模块内 – Evgeniy

+1

您可以尝试手动将x86 libs放在'BOOST_ROOT/lib32-msvc-14.0 /'和x64的'BOOST_ROOT/lib64-msvc-14.0 /'中并再次检查吗? – llonesmiz

我猜你有BOOST_ROOT某处设置你的poject,在缓存中,或在一个环境变量中。

sources看,你可以通过设置Boost_LIBRARY_DIR短路查找过程。使用CMAKE_SIZEOF_VOID_P检测架构:

if(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    set(Boost_LIBRARY_DIR ${BOOST_ROOT}/stage64/lib 
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) 
    set(Boost_LIBRARY_DIR ${BOOST_ROOT}/stage/lib 
endif() 

find_package(...) 

${BOOST_ROOT}可以与$ENV{BOOST_ROOT}代替。

+0

Boost_LIBRARY_DIR是FindBoost模块的结果,它不会将它看作参数。它看起来到BOOST_LIBRARYDIR参数。但即使我用它 - 没有运气。如果我有“阶段”目录 - 在任何情况下都会使用库,我不能改变它 – Evgeniy

+0

'Boost_LIBRARY_DIR'是一个参数。看看[这里](https://github.com/Kitware/CMake/blob/master/Modules/FindBoost.cmake#L150)和[这里](https://github.com/Kitware/CMake/blob/master /Modules/FindBoost.cmake#L912)。它用于设置'Boost_LIBRARY_DIR_RELEASE'的默认值。看看[这里](https://github.com/Kitware/CMake/blob/master/Modules/FindBoost.cmake#L1349),它会在'BOOST_LIBRARYDIR'和'BOOST_ROOT'之前使用 – wasthishelpful

+0

对不起,我的第一条评论 - 你是完全正确的。清理缓存后,我再次重新测试它,并且它可以正常工作。谢谢! – Evgeniy