web-dev-qa-db-ja.com

CMakeプロジェクトにBoostを追加しますか?

バックグラウンド

私はC++の完全な初心者であり、次々と頭痛の種になっています。これが信じられないほど単純で、私がだとしたら、私を許してくださいダム...

最終的にLinuxでコンパイルして実行するプロジェクトがあります。残念ながら 私のC++開発環境の多くの問題 (まだ未解決)の後、私はLinuxでの開発をあきらめてWindows Visual Studio 2017に移行しました。私の希望は、コードをWindowsで動作させ、 C++はおそらく移植可能な言語なので、最小限の変更でLinuxで動作するはずです。

1日ほどの間、Visual Studioは機能しているように見えました。コードを書いて「コンパイル」を押すと、魔法のように実行されます。いくつかのクラスをまとめて有向非循環グラフを作成し、ハッシュテーブルの標準ライブラリを使用してから、ソケットを作成しようとしました...

WindowsとLinuxではソケットに異なるライブラリ(<sys/socket.h><winsock.h>)を使用しているため、違いを抽象化する方法が必要であり、確立された標準を使用しました。私が見つけた周りのグーグル Boostライブラリ 自分のニーズに合うように見えた...それがすべてが地獄に行ったときです。

プロジェクトのセットアップ

このプロジェクトはさまざまなプラットフォームとIDEで開発されるため(Windows + Visual Studioを使用する人、Mac + Eclipseを使用する人、Linux + VIMを使用する人)、CMakeプロジェクトにすることにしました。数時間の読書と学習と研究の後、CMakeは私が欲しいものを与えるようです(依存関係の問題がほとんどないか、まったくない便利で再現可能なクロスプラットフォームのビルド)

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

私のソースコード(Windows Boost Getting Started ガイドから直接)は次のとおりです。

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) << " ");
}

WindowsでのBoost Getting Started ガイドに従って、ここからBoostをダウンロードしました:

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

(興味深いことに、入門ガイドのタイトルは「WindowsでのBoost Getting Started-1.69.0」ですが、Boostバージョン1.67.0にリンクしています)

Zipファイルをダウンロードして解凍した後、ファイルの全体がめちゃくちゃになりましたが、どこに置くべきかわかりませんでした。

Boost download directory

これまでのところ機能させるための試み

プロジェクトにBoostライブラリを追加する を試みましたが、期待されるメニューオプションが利用できませんでした:

Right-clicking on project in Solution Explorer

私は できませんでしたfindasinglepage これはあなたにこの落とし穴を警告します、どうやらCMakeプロジェクトにはとらえどころのない[プロパティ]ウィンドウがありません-代わりに、サードパーティのライブラリを何らかの方法でCMakeLists.txtファイルに含める必要があります

手始めに、entireBoost Zipファイルの540 MBのコンテンツを、プロジェクト内のフォルダ名「Boost」:

Boost in project

次に、一連のさまざまなCMakeList.txtコマンドを試しました。

あたり CMakeLists.txtにBoostライブラリをどのように追加しますか?

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からのcannot open source file "boost/lambda/lambda.hpp"に関するエラー。実際、これらの "CMakeLists.txt"エラーに関して、enough行を追加した後ファイルVisual Studioを定期的にクラッシュさせ始めました。私は第8世代のi7、32ギガバイトのRAM、およびM.2 NVMeハードドライブを持っていることに注意してください。テキストファイルの数行が、コンピューターを10分間ロックするのに十分なほど怒っていることにかなり感銘を受けました。時間。

すべてが失敗したので、必要なファイルをプロジェクトに直接コピーしてみました。

New project setup

さて、再び、私はC/C++開発に不慣れで、うまくいかない可能性があるすべてが間違っています。これまでのところ、ほぼ2週間を費やしており、2台のコンピューター、3つのIDE、4つのコンパイラーで単一の「Hello、World」アプリをコンパイルすることはほとんどできませんでした。サードパーティのライブラリを含め、人気のレベルやシンプルさのレベルに関係なく、私はまだ成功しておらず、ライブラリを参照する機能プログラムを実際にコンパイルしています。だから私が言うとき私を信じてください:「ヘッダーのみのライブラリ」と...代替が何であれ...の違いがわかりません。 Boost Getting Started on Windows ガイドに従って、mostof Boostは「ヘッダーのみ」なので、ビルド手順は必要ありません。使用するのは簡単です。さらに、この例(boost::lambdaを使用)は、指示に従って、ヘッダーのみのライブラリであるため、非常に使いやすいはずです。

システムインクルードディレクトリ(この時点で認識している限り、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が見つかります)ファイルエクスプローラーで)-それでも私はstillエラーになっています:

cannot open source file "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.

これにもかかわらず、私はstillエラーを取得しています:

cannot open source file "boost/lambda/lambda.hpp"

この時点で、髪の毛をはがします。何が悪いのですか?私は何を知らないのですか? Boostに相当する "Hello、World"のように単純なものが機能しないのはなぜですか。

6
stevendesu

これは、CMake 3.12を搭載したBoost 1.68の実際のセットアップです。 Boost 1.69は、cmakeが適切に検出するには「新しすぎる」ようです。ブーストはcmakeでビルドできないため、cmake自体が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を呼び出すと、次のようになります。

cmake -DCMAKE_PREFIX_PATH=path_to_local_directory ..

ここで、path_to_local_directoryは、依存するallライブラリのインストールパスです。これは、Boost、nlohmann_json、glfw3、Qtで機能します。名前は*(1)です。私の場合、それはC:/local/で、別のケースは../external/でした(はい、プロジェクトのローカルディレクトリでもかまいません)。

自分のC:/local/をのぞいてみましょう:

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/

[〜#〜] warning [〜#〜]:コンパイラアーキテクチャがインストールされているブーストバージョンと同じであることを確認します。それ以外の場合、cmakeは単にそれを見つけません。

それについてだと思います。次のCMakeバージョン(3.14)は最新のブーストで動作するはずです。


*(1)上記のライブラリは、そのCMakeターゲットをエクスポートする必要があるか、FindXXX.cmakeを提供する必要があります

1

target_include_directories(CMakeProject2 PRIVATE .)CMakeList.txtに追加します。

boost/lambda/lambda.hppからのCMakeLists.txtの相対パスです

また、.hppファイルをソースリストに追加しないでください。

0
rene-d