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

在cmake项目中添加boost?

  •  2
  • stevendesu  · 技术社区  · 6 年前

    背景

    我是一个完全C++的NeWB,我已经遇到了一个又一个头痛的问题,所以请原谅我,如果这是非常简单的,我是 只是那个哑巴

    我有一个最终应该在Linux中编译和运行的项目。不幸的是,之后 lots of issues with my C++ development environemnt (仍悬而未决),我放弃了在Linux中开发,转而使用Windows Visual Studio 2017。我的希望是让我的代码在Windows中工作,然后,因为C++被认为是一种可移植的语言,它应该只是在Linux中以最小的变化工作。

    大约有一天,Visual Studio似乎在工作。我可以编写代码,点击“编译”,然后像魔法一样运行它。我把几个类放在一起构造了一个有向非循环图,使用了哈希表的标准库,然后我试图创建一个套接字…

    Windows和Linux对套接字使用不同的库( <sys/socket.h> VS <winsock.h> )因此,我需要某种方法来抽象这些差异,我更喜欢一个成熟的标准。在我发现的周围搜索 the Boost library 这似乎符合我的需要…就在那时,一切都变成了地狱。

    我的项目设置

    因为这个项目将在各种平台和IDE上开发(有些人使用Windows+Visual Studio,有些人使用Mac+Eclipse,还有一些人使用Linux+Vim),所以我选择把它变成一个cmake项目。经过几个小时的阅读、学习和研究,我觉得cmake应该给我想要的东西(方便且可复制的跨平台构建,几乎没有依赖性问题)

    Creating a new project, pt 1 Creating a new project, pt 2

    我的源代码(直接从 Boost Getting Started on Windows 指南)如下:

    CMAKEProject2.cpp项目

    #include <boost/lambda/lambda.hpp>
    #include <iostream>
    #include <iterator>
    #include <algorithm>
    
    int main()
    {
        using namespace boost::lambda;
        typedef std::istream_iterator<int> in;
    
        std::for_each(
            in(std::cin), in(), std::cout << (_1 * 3) << " ");
    }
    

    每个 Boost Windows入门 指南,我从这里下载了Boost:

    https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.zip

    (有趣的是,《入门指南》标题为“Boost Getting Started on Windows-1.69.0”,但它链接到Boost版本1.67.0)

    下载和提取zip文件后,我有一大堆文件——但不知道放在哪里:

    Boost download directory

    到目前为止,尝试让它发挥作用

    我试着 add the Boost library to my project ,但没有可用的预期菜单选项:

    Right-clicking on project in Solution Explorer

    虽然我 couldn't find a single page 这就警告了你这一点,显然cmake项目没有难以捉摸的“属性”窗口-相反,第三方库必须通过cmakelists.txt文件包含在其中。

    首先,我复制了 整个的 在文件夹名“boost”下,将boost zip文件的540 MB内容发送到我的项目中:

    Boost in project

    然后我尝试了一系列不同的cmakelist.txt命令:

    How do you add Boost libraries in CMakeLists.txt? :

    set(Boost_USE_STATIC_LIBS OFF) 
    set(Boost_USE_MULTITHREADED ON)  
    set(Boost_USE_STATIC_RUNTIME OFF) 
    find_package(Boost REQUIRED COMPONENTS lambda) 
    
    if(Boost_FOUND)
        include_directories(${Boost_INCLUDE_DIRS}) 
        add_executable(CMakeProject2 "CMakeProject2.cpp" "CMakeProject2.h") 
        target_link_libraries(CMakeProject2 ${Boost_LIBRARIES})
    endif()
    

    https://www.selectiveintellect.net/blog/2016/7/29/using-cmake-to-add-third-party-libraries-to-your-project-1 :

    include("Boost")
    add_subdirectory("Boost")
    add_subdirectory("boost")
    add_subdirectory("Boost/boost")
    add_subdirectory("Boost/boost/lambda")
    
    target_link_libraries(boost)
    target_link_libraries(Boost)
    

    https://cmake.org/pipermail/cmake/2009-November/033249.html :

    SET (Boost_FIND_REQUIRED TRUE)
    SET (Boost_FIND_QUIETLY TRUE)
    SET (Boost_DEBUG FALSE)
    set (Boost_USE_MULTITHREADED TRUE)
    set (Boost_USE_STATIC_LIBS TRUE)
    SET (Boost_ADDITIONAL_VERSIONS "1.67" "1.67.0")
    
    FIND_PACKAGE(Boost COMPONENTS  lambda)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
    LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
    

    我试过其他几个咒语(不熟悉C++) cmake作为一个工具)和从cmakeLists.txt或从cmakeProject2.cpp about接收到错误 cannot open source file "boost/lambda/lambda.hpp" . 事实上,在添加 足够地 在我的文件中,我开始定期崩溃Visual Studio。请注意,我有一个第8代i7、32GB的RAM和一个M.2NVMe硬盘,所以我很惊讶,一个文本文件中的几行代码足以让微软把我的电脑一次锁上10分钟。

    失败的是,我尝试将我需要的文件直接复制到我的项目中:

    New project setup

    现在,我对C/C++开发和所有可能出错的东西都很陌生。 出了差错。到目前为止,我已经花了近两周时间,几乎没能在两台计算机、三个IDE和四个编译器上编译出一个“你好,世界”应用程序。我还没有取得任何成功,包括任何地方的第三方库,任何流行级别或简单级别,并实际编译了一个引用该库的运行程序。所以,当我说:我不知道“仅标题库”和…无论选择什么。我只知道,根据 Boost Windows入门 指南, Boost的特性是“仅限头部”,因此我不应该有任何构建步骤——应该很容易使用它。此外,此示例(使用 boost::lambda )是一个只包含标题的库,因此应该非常容易使用。

    现在,我稍微更新了源代码,以便在当前目录中查找,而不是在系统include目录中查找(据我目前所知,Windows中不存在该目录):

    #include "boost/lambda/lambda.hpp"
    #include <iostream>
    #include <iterator>
    #include <algorithm>
    
    int main()
    {
        using namespace boost::lambda;
        typedef std::istream_iterator<int> in;
    
        std::for_each(
            in(std::cin), in(), std::cout << (_1 * 3) << " ");
    }
    

    现在我可以 人工验证 此文件存在(文件 CMakeProject2\CMakeProject2\boost\lambda\lambda.hpp 可以在文件资源管理器中找到)-但是我 仍然 获得错误:

    无法打开源文件“boost/lambda/lambda.hpp”

    进一步的谷歌搜索使我再次更新了cmakelists.txt文件,并将其置于当前格式:

    # CMakeList.txt : CMake project for CMakeProject2, include source and define
    # project specific logic here.
    #
    cmake_minimum_required (VERSION 3.8)
    
    # Add source to this project's executable.
    file(GLOB CMakeProject2_SRC
        "*.h"
        "*.cpp"
        "**/*.h"
        "**/*.cpp"
        "**/*.hpp"
        "boost/lambda/lambda.hpp"
    )
    add_executable (CMakeProject2 ${CMakeProject2_SRC})
    #add_executable (CMakeProject2 "CMakeProject2.cpp" "CMakeProject2.h")
    
    # TODO: Add tests and install targets if needed.
    

    尽管如此,我 仍然 获取错误:

    无法打开源文件“boost/lambda/lambda.hpp”

    在这一点上,我要把头发扯下来。我做错什么了?我不知道什么?像“你好,世界”这样简单的东西怎么不适合我?

    3 回复  |  直到 6 年前
        1
  •  3
  •   vre    6 年前

    official boost binaries location

    cmake_minimum_required (VERSION 3.8)
    
    project(boostAndCMake)
    
    set(BOOST_ROOT "C:\Boost") # either set it here or from the command line  
    set(Boost_USE_STATIC_LIBS OFF) 
    set(Boost_USE_MULTITHREADED ON)  
    set(Boost_USE_STATIC_RUNTIME OFF) 
    find_package(Boost REQUIRED COMPONENTS system) # header only libraries must not be added here
    
    add_executable(CMakeProject2 CMakeProject2.cpp CMakeProject2.h) 
    target_include_directories(CMakeProject2 PUBLIC ${Boost_INCLUDE_DIRS}) 
    target_link_libraries(CMakeProject2 ${Boost_LIBRARIES})
    

    REQUIRED find_package Boost_FOUND

    cmake -H. -Bbuildit -G "Visual Studio 15 2017" -DBOOST_ROOT=C:\Boost 
    

    BOOST_ROOT find_package(Boost ...) FindBoost

    post

    set(Boost_ADDITIONAL_VERSIONS "1.69.0" "1.69")

        2
  •  1
  •   Guillaume Racicot    6 年前

    FindBoost.cmake

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.11)
    
    project(foobar)
    
    find_package(Boost 1.68 REQUIRED)
    add_executable(foo foo.cpp)
    target_link_libraries(foo PUBLIC Boost::boost)
    

    cmake -DCMAKE_PREFIX_PATH=path_to_local_directory ..
    

    path_to_local_directory C:/local/ ../external/

    ls -l /c/local/
    total 12
    drwxr-xr-x 1 myself 197609 0 May 26  2018 boost_1_67_0/
    drwxr-xr-x 1 myself 197609 0 Sep  5 02:02 boost_1_68_0/
    


        3
  •  0
  •   rene-d    6 年前

    target_include_directories(CMakeProject2 PRIVATE .) CMakeList.txt

    boost/lambda/lambda.hpp CMakeLists.txt

    .hpp