代码之家  ›  专栏  ›  技术社区  ›  BullyWiiPlaza

CMake:在Windows上使用带MSVC的Boost v1.69

  •  0
  • BullyWiiPlaza  · 技术社区  · 6 年前

    我正试着使用 Boost 我的图书馆 C++ 计划 Windows 使用 CLion MinGW MSVC . 我下载了预编译的二进制文件 here C:\local\boost_1_69_0_b1_rc3 . 我设置了以下内容 CMakeLists.txt

    cmake_minimum_required(VERSION 3.11.4)
    project(BoostTesting)
    
    set(CMAKE_CXX_STANDARD 17)
    
    set(BOOST_ROOT "C:/local/boost_1_69_0_b1_rc3")
    set(BOOST_LIBRARYDIR "C:/local/boost_1_69_0_b1_rc3/lib64-msvc-14.1")
    set(BOOST_INCLUDEDIR "C:/local/boost_1_69_0_b1_rc3/boost")
    
    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_USE_MULTITHREADED ON)
    set(Boost_USE_STATIC_RUNTIME OFF)
    set(Boost_DEBUG ON)
    set(Boost_DETAILED_FAILURE_MSG ON)
    set(Boost_COMPILER "-vc141")
    set(Boost_ARCHITECTURE "-x64")
    
    find_package(Boost 1.69.0 COMPONENTS filesystem REQUIRED)
    
    if (Boost_FOUND)
        include_directories(${Boost_INCLUDE_DIRS})
        add_executable(BoostTesting main.cpp)
        target_link_libraries(BoostTesting ${Boost_LIBRARIES})
    endif ()
    

    使用 CMake FindBoost 调试模式( Boost_DEBUG )我得到了以下输出:

    C:\Users\User\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\183.4284.104\bin\cmake\win\bin\cmake.exe -DCMAKE_BUILD_TYPE=Debug "-DCMAKE_MAKE_PROGRAM=C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/mingw32-make.exe" "-DCMAKE_C_COMPILER=C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/x86_64-w64-mingw32-gcc.exe" "-DCMAKE_CXX_COMPILER=C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/x86_64-w64-mingw32-g++.exe" -G "CodeBlocks - MinGW Makefiles" D:\Cpp\BoostTesting
    -- The C compiler identification is GNU 8.1.0
    -- The CXX compiler identification is GNU 8.1.0
    -- Check for working C compiler: C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/x86_64-w64-mingw32-gcc.exe
    -- Check for working C compiler: C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/x86_64-w64-mingw32-gcc.exe -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Check for working CXX compiler: C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/x86_64-w64-mingw32-g++.exe
    -- Check for working CXX compiler: C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/x86_64-w64-mingw32-g++.exe -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    CMake Warning (dev) at CMakeLists.txt:18 (find_package):
      Policy CMP0074 is not set: find_package uses <PackageName>_ROOT variables.
      Run "cmake --help-policy CMP0074" for policy details.  Use the cmake_policy
      command to set the policy and suppress this warning.
    
      Environment variable Boost_ROOT is set to:
    
        C:\local\boost_1_68_0\boost
    
      For compatibility, CMake is ignoring the variable.
    This warning is for project developers.  Use -Wno-dev to suppress it.
    
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1125 ] _boost_TEST_VERSIONS = 
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1127 ] Boost_USE_MULTITHREADED = ON
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1129 ] Boost_USE_STATIC_LIBS = ON
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1131 ] Boost_USE_STATIC_RUNTIME = OFF
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1133 ] Boost_ADDITIONAL_VERSIONS = 
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1135 ] Boost_NO_SYSTEM_PATHS = 
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1203 ] Declared as CMake or Environmental Variables:
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1205 ]   BOOST_ROOT = C:/local/boost_1_69_0_b1_rc3
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1207 ]   BOOST_INCLUDEDIR = C:/local/boost_1_69_0_b1_rc3/boost
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1209 ]   BOOST_LIBRARYDIR = C:/local/boost_1_69_0_b1_rc3/lib64-msvc-14.1
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1211 ] _boost_TEST_VERSIONS = 
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1286 ] Include debugging info:
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1288 ]   _boost_INCLUDE_SEARCH_DIRS = C:/local/boost_1_69_0_b1_rc3/boost;C:/local/boost_1_69_0_b1_rc3/include;C:/local/boost_1_69_0_b1_rc3;PATHS;C:/boost/include;C:/boost;/sw/local/include
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1290 ]   _boost_PATH_SUFFIXES = 
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1310 ] location of version.hpp: C:/local/boost_1_69_0_b1_rc3/boost/version.hpp
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1334 ] version.hpp reveals boost 1.69.0
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1410 ] using user-specified Boost_COMPILER = -vc141
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1430 ] _boost_MULTITHREADED = -mt
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1506 ] _boost_RELEASE_ABI_TAG = -
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1508 ] _boost_DEBUG_ABI_TAG = -d
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1571 ] _boost_LIBRARY_SEARCH_DIRS_RELEASE = C:/local/boost_1_69_0_b1_rc3/lib64-msvc-14.1;C:/local/boost_1_69_0_b1_rc3/lib;C:/local/boost_1_69_0_b1_rc3/stage/lib;C:/local/boost_1_69_0_b1_rc3/lib;C:/local/boost_1_69_0_b1_rc3/../lib;C:/local/boost_1_69_0_b1_rc3/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib_boost_LIBRARY_SEARCH_DIRS_DEBUG   = C:/local/boost_1_69_0_b1_rc3/lib64-msvc-14.1;C:/local/boost_1_69_0_b1_rc3/lib;C:/local/boost_1_69_0_b1_rc3/stage/lib;C:/local/boost_1_69_0_b1_rc3/lib;C:/local/boost_1_69_0_b1_rc3/../lib;C:/local/boost_1_69_0_b1_rc3/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib
    CMake Warning at C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:847 (message):
      New Boost version may have incorrect or missing dependencies and imported
      targets
    Call Stack (most recent call first):
      C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:963 (_Boost_COMPONENT_DEPENDENCIES)
      C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1622 (_Boost_MISSING_DEPENDENCIES)
      CMakeLists.txt:18 (find_package)
    
    
    CMake Warning at C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:847 (message):
      New Boost version may have incorrect or missing dependencies and imported
      targets
    Call Stack (most recent call first):
      C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:963 (_Boost_COMPONENT_DEPENDENCIES)
      C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1622 (_Boost_MISSING_DEPENDENCIES)
      CMakeLists.txt:18 (find_package)
    
    
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1760 ] Searching for FILESYSTEM_LIBRARY_RELEASE: libboost_filesystem-vc141-mt-1_69;libboost_filesystem-vc141-mt;libboost_filesystem-mt-1_69;libboost_filesystem-mt;libboost_filesystem
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1813 ] Searching for FILESYSTEM_LIBRARY_DEBUG: libboost_filesystem-vc141-mt-d-1_69;libboost_filesystem-vc141-mt-d;libboost_filesystem-mt-d-1_69;libboost_filesystem-mt-d;libboost_filesystem-mt;libboost_filesystem
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1760 ] Searching for SYSTEM_LIBRARY_RELEASE: libboost_system-vc141-mt-1_69;libboost_system-vc141-mt;libboost_system-mt-1_69;libboost_system-mt;libboost_system
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1813 ] Searching for SYSTEM_LIBRARY_DEBUG: libboost_system-vc141-mt-d-1_69;libboost_system-vc141-mt-d;libboost_system-mt-d-1_69;libboost_system-mt-d;libboost_system-mt;libboost_system
    -- [ C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:1887 ] Boost_FOUND = 1
    CMake Error at C:/Users/User/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/183.4284.104/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:2048 (message):
      Unable to find the requested Boost libraries.
    
      Boost version: 1.69.0
    
      Boost include path: C:/local/boost_1_69_0_b1_rc3
    
      Could not find the following static Boost libraries:
    
              boost_filesystem
    
      Some (but not all) of the required Boost libraries were found.  You may
      need to install these additional Boost libraries.  Alternatively, set
      BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT
      to the location of Boost.
    Call Stack (most recent call first):
      CMakeLists.txt:18 (find_package)
    
    
    -- Configuring incomplete, errors occurred!
    See also "D:/Cpp/BoostTesting/cmake-build-debug/CMakeFiles/CMakeOutput.log".
    
    [Failed to reload]
    

    正在查找这些特定的文件,但我注意到 -x64 指示不是搜索文件名的一部分。我的目录只包含 64-bit

    Boost_ARCHITECTURE 忽略环境变量?我希望它能补充缺失的部分 搜索到的文件名。如果我手动重命名 libboost_filesystem-vc141-mt*.lib 可以通过以下方式找到它们的文件: 克马克 main.cpp 我收到一个链接器错误:

    ====================[ Build | BoostTesting | Debug ]============================
    C:\Users\User\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\183.4284.104\bin\cmake\win\bin\cmake.exe --build D:\Cpp\BoostTesting\cmake-build-debug --target BoostTesting -- -j 4
    Scanning dependencies of target BoostTesting
    [ 50%] Building CXX object CMakeFiles/BoostTesting.dir/main.cpp.obj
    [100%] Linking CXX executable BoostTesting.exe
    CMakeFiles\BoostTesting.dir/objects.a(main.cpp.obj): In function `boost::filesystem::path_traits::convert(char const*, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)':
    C:/local/boost_1_69_0_b1_rc3/boost/filesystem/path.hpp:997: undefined reference to `boost::filesystem::path::codecvt()'
    C:/local/boost_1_69_0_b1_rc3/boost/filesystem/path.hpp:997: undefined reference to `boost::filesystem::path_traits::convert(char const*, char const*, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&, std::codecvt<wchar_t, char, int> const&)'
    CMakeFiles\BoostTesting.dir/objects.a(main.cpp.obj): In function `boost::filesystem::file_size(boost::filesystem::path const&)':
    C:/local/boost_1_69_0_b1_rc3/boost/filesystem/operations.hpp:616: undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
    collect2.exe: error: ld returned 1 exit status
    mingw32-make.exe[3]: *** [CMakeFiles\BoostTesting.dir\build.make:88: BoostTesting.exe] Error 1
    mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:72: CMakeFiles/BoostTesting.dir/all] Error 2
    mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:84: CMakeFiles/BoostTesting.dir/rule] Error 2
    mingw32-make.exe: *** [Makefile:117: BoostTesting] Error 2
    

    main.cpp 源代码:

    #include <iostream>
    #include <boost/filesystem.hpp>
    
    using namespace boost::filesystem;
    
    int main(int argc, char *argv[]) {
        if (argc < 2) {
            std::cout << "Usage: tut1 path\n";
            return 1;
        }
        std::cout << argv[1] << " " << file_size(argv[1]) << '\n';
        return 0;
    }
    

    我很确定重命名文件不是正确的方法。但即使这样也不行。我做错了什么?你如何正确使用 简单地说 像这样的项目?

    4 回复  |  直到 6 年前
        1
  •  1
  •   Leslie N    6 年前
    1. 你得到了一个警告

      因为CMake版本并没有为boost 1.69做好准备(也许最新的CMake会…)。

    2. @费利克斯·纳特正确地指出了这一点 Boost_ARCHITECTURE

    3. 无需手动重命名即可使其正常工作, 没有GCC或MINGW ,如果您使用其中一个文件命名“布局”重建boost,您的CMake将识别。 (从调试日志中,可以看到以下内容:

      libboost_<module name>-<toolset>[-mt]-<ABI tag>-<boost version>
      libboost_<module name>-<toolset>[-mt]-<ABI tag>
      libboost_<module name>[-mt]-<ABI tag>-<boost version>
      libboost_<module name>[-mt]
      libboost_<module name>

      system 布局匹配,这意味着您需要在不同的“lib”文件夹中分离调试和发布版本。有关“布局”参数的说明,请参见 see here.

      因此,通过指定 --layout=system 参数,并通过指定 variant=debug variant=release

      作为起点,您可以在SF上找到构建日志文件: https://sourceforge.net/projects/boost/files/boost-binaries/1.69.0/boost_1_69_0-64bitlog.txt/download
      文件中的最后一个构建“条目”是针对vc141的,它是您的版本:
      b2 -j%NUMBER_OF_PROCESSORS% --without-mpi --build-type=complete toolset=msvc-14.1 address-model=64 architecture=x86 --prefix=.\ --libdir=lib64-msvc-14.1 --includedir=garbage_headers install

      > bootstrap 第一。 确保检测到msvc-14.1。


      > b2 -a -j%NUMBER_OF_PROCESSORS% --without-mpi --with-filesystem toolset=msvc-14.1 address-model=64 architecture=x86 variant=debug --layout=system --prefix=C:\boost_build\debug

      改变 --prefix 根据你的需要。您也可以指定 --libdir --includedir 当然,您可能需要修改CMakeList文件,以便它可以同时使用调试和发布变体。。。

    因此,最好是使用CMake版本(识别boost 1.69版)和/或获得基于CMake的boost版本(包括1.69版)。

        2
  •  3
  •   rubenvb    6 年前

    find_package(Boost ...) 在您的案例中失败,因为它无法找到 REQUIRED filesystem

    确保您也有Boost的GCC版本,因为现在只显示了V++库。

        3
  •  1
  •   Felix Natter    6 年前
    set(Boost_ARCHITECTURE "-x64")
    

    仅适用于cmake>=3.13 [1] [2]. 如果无法升级到cmake 3.13+,

    set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID, "x64")
    

    (不确定在什么条件下自动设置)

    [1] https://cmake.org/cmake/help/v3.12/module/FindBoost.html https://cmake.org/cmake/help/v3.13/module/FindBoost.html

        4
  •  0
  •   BullyWiiPlaza    6 年前

    事实证明,当使用 MinGW distribution with built-in Boost

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.11.4)
    project(BoostTesting)
    
    set(CMAKE_CXX_STANDARD 17)
    
    if(WIN32)
        set(BOOST_ROOT "C:/MinGW")
    endif ()
    
    find_package(Boost 1.67.0 COMPONENTS filesystem REQUIRED)
    
    if (Boost_FOUND)
        include_directories(${Boost_INCLUDE_DIRS})
        add_executable(BoostTesting main.cpp)
        target_link_libraries(BoostTesting ${Boost_LIBRARIES})
    endif ()
    

    main.cpp 输出:

    D:\Cpp\BoostTesting\cmake-build-debug\BoostTesting.exe
    Usage: tut1 path
    
    Process finished with exit code 1