【发布时间】:2016-09-26 08:18:31
【问题描述】:
对于 x86 和 x64,Boost 编译的库具有相同的名称。我的项目使用 Boost,我希望它在使用 CMake for x64 或 x86 目标编译时自动链接正确的 Boost 库
我的 CMakeFiles.txt 使用简单的代码
find_package(Boost REQUIRED
COMPONENTS
coroutine context thread filesystem program_options system
)
我的 Boost 是用 (MSVC2015) 构建的
b2 address-model=32 --build-type=minimal stage --stagedir stage
b2 address-model=64 --build-type=minimal stage --stagedir stage64
我也尝试过“安装”目标并将 boost 构建放入单独的文件夹中
我正在使用 (Windows) 构建我的项目
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 目标构建成功,因为它的库(boost)位于 CMake 的 FindBoost 模块众所周知的“stage”文件夹中
但无法构建 x64 目标,因为 FindBoost 使用 Boost 的 x86 库进行构建过程,并且不会尝试使用来自“stage64”的库,但出现此错误:
D:\lib\boost_1_61_0\stage\lib\libboost_coroutine-vc140-mt-gd-1_61.lib:警告 LNK4272:库机器类型“X86”与目标机器类型“x64”冲突
我的目标是在“Cmake”调用中排除任何其他参数来构建我的项目,我希望它能够根据我使用的 CMAKE 的 -G 参数自动为 x86 或 x64 找到正确的 boost 库
如何更改我的 CMakeFiles.txt 以使其自动找到正确的 boost 库?
Boost 版本 - 1.61、MSVC 2015、CMAKE - 3.6.2(最新并了解 boost 1.61)、Windows 7 x64
【问题讨论】:
-
在为 x86_64 构建项目时,您可以将 CMake 变量
BOOST_ROOT设置为适当的目录 (D:\lib\boost_1_61_0\stage64)。 -
@Tsyvarev,不幸的是,boost 阶段目录不包含包含 - 只有库。所以我需要将 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 模块中进行了硬编码
-
您可以尝试手动将 x86 库放入
BOOST_ROOT/lib32-msvc-14.0/并将 x64 库放入BOOST_ROOT/lib64-msvc-14.0/并再次检查吗? -
@jv_,看起来你是对的。我需要删除“stage”目录并将 x86 库放在其他地方。如果我的 boost 文件夹包含“stage” - 它使用它并且根本不查看 BOOST_LIBRARY_DIR
-
wasthishelpful 的回答似乎更好,但您可能需要使用
stage32而不仅仅是stage。问题似乎是BOOST_ROOT/stage/lib似乎被无条件添加到CMake查找库的目录列表中。