【问题标题】:CMake find Boost both x86 and x64 on same machineCMake在同一台机器上找到提升x86和x64
【发布时间】: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查找库的目录列表中。

标签: boost cmake


【解决方案1】:

我猜你在项目、缓存或环境变量中的某个位置设置了BOOST_ROOT

查看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 参数。但即使我使用它 - 也没有运气。如果我有“舞台”目录 - 在任何情况下都将使用库,我无法更改它
  • Boost_LIBRARY_DIR 是一个参数。查看herehere。用于设置Boost_LIBRARY_DIR_RELEASE 的默认值。查看here,然后在BOOST_LIBRARYDIRBOOST_ROOT 之前使用它
  • 抱歉我的第一条评论 - 你是完全正确的。清理缓存后,我再次对其进行了重新测试,并且可以正常工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多