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位
我猜你有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}
代替。
Boost_LIBRARY_DIR是FindBoost模块的结果,它不会将它看作参数。它看起来到BOOST_LIBRARYDIR参数。但即使我用它 - 没有运气。如果我有“阶段”目录 - 在任何情况下都会使用库,我不能改变它 – Evgeniy
'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
对不起,我的第一条评论 - 你是完全正确的。清理缓存后,我再次重新测试它,并且它可以正常工作。谢谢! – Evgeniy
当为x86_64构建项目时,您可以将CMake变量'BOOST_ROOT'设置为approprite目录('D:\ lib \ boost_1_61_0 \ stage64')。 – Tsyvarev
@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
您可以尝试手动将x86 libs放在'BOOST_ROOT/lib32-msvc-14.0 /'和x64的'BOOST_ROOT/lib64-msvc-14.0 /'中并再次检查吗? – llonesmiz