在同一台计算机上使用CMake查找Boost库的x86和x64版本

3
Boost编译库在x86和x64上有相同的名称。我的项目使用了Boost,我希望在使用CMake为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)位于“stage”文件夹中,而CMake的FindBoost模块熟知该文件夹,所以x86目标构建成功。

但是x64目标无法构建,因为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”调用时排除任何其他参数,使其自动找到正确的x86或x64 Boost库,具体取决于我使用的CMAKE的-G参数。

我应如何更改我的CMakeFiles.txt才能使其自动查找正确的Boost库?

Boost版本-1.61,MSVC 2015,CMAKE-3.6.2(最新版本并熟知Boost 1.61),Windows 7 x64。


1
当为x86_64构建项目时,您可以将CMake变量BOOST_ROOT设置为适当的目录(D:\lib\boost_1_61_0\stage64)。 - Tsyvarev
@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模块中被硬编码了。 - Evgeniy
1
你可以尝试手动将x86库放入BOOST_ROOT/lib32-msvc-14.0/,将x64库放入BOOST_ROOT/lib64-msvc-14.0/,然后再次检查吗? - llonesmiz
1
wasthishelpful的回答似乎更好,但你可能需要使用stage32而不是仅仅使用stage。问题似乎在于BOOST_ROOT/stage/lib被无条件地添加到CMake查找库的目录列表中。 - llonesmiz
“boost stage dir does not contain includes”这是因为它是一个暂存(中间)目录。您需要实际安装构建结果,以获取包含头文件和二进制文件的目录,然后可以将其用作BOOST_ROOT - Dan Mašek
显示剩余2条评论
1个回答

4
我猜你在项目、缓存或环境变量中设置了BOOST_ROOT
查看源代码,你可以通过设置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参数。但即使我使用它,也没有运气。如果我有“stage”目录-库将从其中使用,并且我无法更改它。 - Evgeniy
Boost_LIBRARY_DIR 是一个参数。在这里查看:链接1,以及链接2。它用于设置 Boost_LIBRARY_DIR_RELEASE 的默认值。在这里查看:链接3,然后在 BOOST_LIBRARYDIRBOOST_ROOT 之前使用。 - rocambille
很抱歉我之前的评论 - 你是完全正确的。我清除了缓存后重新测试了一下,它确实起作用了。谢谢! - Evgeniy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接