当Boost\u包含IR&;时查找包(Boost)错误;BOOST_LIBRARYDIR则不同

当Boost\u包含IR&;时查找包(Boost)错误;BOOST_LIBRARYDIR则不同,boost,cmake,Boost,Cmake,我正试图将Boost编译为共享库,并使它们成为我的跨平台CMake项目的依赖项 为此,我编译了适用于win32、x64和linux的boost,其中我的boost文件夹结构如下所示: - boost_1_69_0/ - boost/ - stage/ - win32 - lib - x64 - lib - linux - lib 然后我在做: set(BOOST_INCLUDEDIR ${CMAKE_CURRENT_SOURC

我正试图将Boost编译为共享库,并使它们成为我的跨平台CMake项目的依赖项

为此,我编译了适用于win32、x64和linux的boost,其中我的boost文件夹结构如下所示:

- boost_1_69_0/
  - boost/
  - stage/
    - win32
      - lib
    - x64
      - lib
    - linux
      - lib
然后我在做:

set(BOOST_INCLUDEDIR ${CMAKE_CURRENT_SOURCE_DIR}/../external/boost_1_69_0)
set(BOOST_LIBRARYDIR ${CMAKE_CURRENT_SOURCE_DIR}/../external/boost_1_69_0/stage/win32)
find_package(Boost REQUIRED COMPONENTS filesystem)
并获得:

CMake Error at C:/Program Files/CMake/share/cmake-3.13/Modules/FindBoost.cmake:2100 (message):
Unable to find the requested Boost libraries.

Boost version: 1.69.0

Boost include path: C:/bla/SW/cmake-template/external/boost_1_69_0

Could not find the following Boost libraries:

        boost_filesystem
那是虫子吗


如果我将
lib
文件夹从
win32
内部移动到其父目录,即:

- boost_1_69_0/
  - boost/
  - stage/
    - lib
这是boost的b2构建的默认方式,然后一切都正常了。但是我不能为不同的平台保存不同的boost二进制文件


编辑

使用
set(Boost\u DEBUG ON)
我发现我的Boost是在我的项目使用v140时用visualstudio v141工具集编译的,因此
FindBoost
正在寻找
Boost\u filesystem-vc140-mt-x64-1\u 69
而不是
Boost\u filesystem-vc140-mt-x64-1\u 69


我想问题已经转移到要么找到强制搜索v141的方法,要么(更好)使用
--layout=system
并找到强制它始终搜索
boost\u文件系统的方法。有没有办法做到这一点?

这里的问题是CMake搜索符合特定命名方案的boost库。您的库与此不同,因为文件名中编码了一些选项。您有两个选择:

  • 再次编译boost,但这次在运行可执行文件b2时使用
    --layout=system
    标志。这将创建具有标准名称的库文件,如
    boost\u filesystem.dll
    boost\u filesystem.lib
  • 使用以下方法,就如何命名库文件给出一些提示(因为我没有像您这样的等效系统,这些都是猜测,您可能不得不采用):
    • Boost\u架构=“-x32”
    • Boost\u编译器=“-vc141”

  • 看看库目录,是否有
    boost\u filesystem.dll
    boost\u filesystem.lib
    ?@StanleyF。有
    boost_filesystem-vc141-mt-x32-1_69.dll
    &
    boost_filesystem-vc141-mt-x32-1_69.lib
    Library目录(boost_LIBRARYDIR应该分配到的目录)是一个立即包含库的目录。在您的例子中,这是一个目录
    external/boost\u 1\u 69\u 0/stage/win32/lib
    (以lib结尾)。顺便说一句,您可以通过将
    Boost\u DEBUG
    变量设置为TRUE来检查
    find\u package(Boost)
    搜索的实际路径。谢谢,
    Boost\u编译器
    解决了这个问题!是否有办法在Windows上搜索
    --layout=system
    ?因为它总是查看默认的Windows布局。当前,如果使用了
    layout=system
    ,则
    FindCmake
    会中断Windows,因为它只查找
    boost\u filesystem-vc140-mt-x64-1\u 69
    ,而不查找
    boost\u filesystem
    。我的问题是,是否可以使用隐藏标志或类似的东西使其工作。@galah92实际上,boost正在寻找
    boost\u文件系统
    ,如中所述。因此,使用
    layout=system
    一切都应该开箱即用。如果没有
    layout=system
    ,则需要将命名方案指定为我的答案提纲中的第2点。