2011-11-10 8 views
14

私は、Windows上でブーストベースのアプリケーションをコンパイルするためにcmakeスクリプトを使用しようとしています。 ヘッダのみのライブラリが正常に動作しますが、cmakesはライブラリを見つけることができない(以下Boostライブラリが見つかりませんでした:boost_serialization)をcmakeのスクリプトの関連部分は次のとおりです。cmakeで追加ライブラリが見つかりません

#path where cmake can find additional libraries 
SET(CMAKE_PREFIX_PATH Libs) 

#boost 
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
SET(Boost_USE_STATIC_LIBS ON) 
find_package(Boost REQUIRED COMPONENTS serialization) 

私は "という名前のフォルダを持っています私のプロジェクトの中にDevilsやboostなどのサードパーティライブラリが格納されているので、まずこれを設定します。悪魔のためにうまく動作し、ヘッダーのみのものを追加するので、私はBOOST_ROOT変数が必要ないはずです。 私はbjamでコンパイルしたboost.orgの標準ソースディストリビューションです。ライブラリはboost_1_47_0 \ bin.v2 \ libsに保存されています。ビルドプロセスで何も変更しませんでした。 boost_1_47_0 \ libsフォルダにはライブラリファイルでbjamファイルやその他のものは含まれていませんが、この継ぎ目はWindows上でブーストを構築する通常の方法であるため、問題ではありません。ソースから。

私はFindBoost.cmake(私はCMake 2.8からのデフォルトスクリプトを使用しています)からのDebug出力を見ましたが、bin.v2を調べるために継ぎ目がありません。代わりにboost_ROOT/libを検索しますが、bin.v2 \ libsの内容をlibにコピーしてもlibにはまだ何も見つかりません。

ブーストを見つけるためのエレガントな方法は、一般的なボスト・ディストリビューションの他のプラットフォームでも機能しますか?

答えて

5

私はこの問題を解決しましたが、私の解決策には十分満足していません。 私の意見では、問題は、bjamが複雑なフォルダ構造を作成するということでした。今度は "boost_1_47_0 \ bin.v2 \ libs \ serialization \ build \ msvc-9.0 \ debug \ link-static \ threading-multi"のライブラリファイルを "boost_1_47_0 \ lib"にコピーしました。私は手でこれを行う必要がありますが、私はその多くのライブラリを使用していないので、このステップは私の意見では大丈夫です。私は自分のソリューションをcmakeスクリプトとは別に文書化しますので、他のユーザーもそれに合わせるべきです。

+5

マニュアルを読んで、stageとインストールについて学んでください。 – mloskot

+0

マニュアル(http://www.boost.org/doc/libs/1_48_0/more/getting_started/windows.html)を読みましたが、オプション5.2を使用しました。ステージディレクトリにすべてのライブラリがあることがわかりました。これを私のブーストライブラリーディレクトリに設定できますが、次回はオプション5.3を試してみます。 – JonathanK

+0

ステージとブースト(ヘッダー)ディレクトリをコピーしてBoostをインストールすることもできます。例えばboost/- > C:\ boost \ include \ boostとstage/* - > C:\ boost \ lib – mloskot

13

CMakeLists.txt内にBOOST_ROOTを設定しようとします。 Boost_ADDITIONAL_VERSIONS変数を設定すると、CMake 2.8.6はBOOST_ROOTが設定されているときにWindows上で動作するので、1.47.0がBoost_ADDITIONAL_VERSIONS変数に設定されていることがわかります。

 

    set(BOOST_COMPONENTS_NEEDED serialization) 

    # The following verifyies that BOOST_ROOT is set properly. 
    if(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 
     FILE(TO_CMAKE_PATH $ENV{BOOST_ROOT} BOOST_ROOT) 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(STATUS ${BOOST_ROOT} " does not exist. Checking if BOOST_ROOT was a quoted string..") 
      STRING(REPLACE "\"" "" BOOST_ROOT ${BOOST_ROOT}) 
      if(EXISTS ${BOOST_ROOT}) 
       MESSAGE(STATUS "After removing the quotes " ${BOOST_ROOT} " was now found by CMake") 
      endif(EXISTS ${BOOST_ROOT}) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    # Save the BOOST_ROOT in the cache 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(WARNING ${BOOST_ROOT} " does not exist.") 
     else(NOT EXISTS ${BOOST_ROOT}) 
      SET (BOOST_ROOT ${BOOST_ROOT} CACHE STRING "Set the value of BOOST_ROOT to point to the root folder of your boost install." FORCE) 
      #SET (BOOST_INCLUDEDIR ${BOOST_ROOT}/Include) 
      #SET (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    endif(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 

    if(WIN32 AND NOT BOOST_ROOT) 
     MESSAGE(WARNING "Please set the BOOST_ROOT environment variable.") 
    endif(WIN32 AND NOT BOOST_ROOT) 

    set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
    set(Boost_DEBUG ON) 
    set(Boost_USE_STATIC_LIBS  OFF) 
    set(Boost_USE_MULTITHREADED  ON) 
    set(Boost_USE_STATIC_RUNTIME OFF) 
    FIND_PACKAGE(Boost 1.47.0 COMPONENTS ${BOOST_COMPONENTS_NEEDED}) 
    if(Boost_FOUND) 
     MESSAGE(STATUS "Setting up boost.") 
     include_directories(${Boost_INCLUDE_DIRS}) 
     if(Boost_DEBUG) 
      MESSAGE(STATUS "BOOST Libraries " ${Boost_LIBRARIES}) 
      FOREACH(BOOST_COMPONENT ${BOOST_COMPONENTS_NEEDED}) 
       STRING(TOUPPER ${BOOST_COMPONENT} BOOST_COMPONENT_UPCASE) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} ": " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Debug: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_DEBUG}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Release: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_RELEASE}) 
      ENDFOREACH(BOOST_COMPONENT) 
     endif(Boost_DEBUG) 
    endif(Boost_FOUND) 

+1

これは私にこのスクリプトのおかげで多くの助けになります。 Boost_FOUNDの直後に次の行を追加したいと思います:LINK_DIRECTORIES($ {Boost_LIBRARY_DIRS})そうでなければ、ライブラリが見つかりませんでした。これが同じ問題を抱えている人たちを助けることを願って – Cross

+0

- ブーストが見つかりませんでした。 ブーストバージョン:1.60.0 ブーストを含むパス:/ usr/include ブーストの検出バージョンが古すぎます。リクエストされたバージョンは1.64(またはそれ以降)でした。 .....上記のコメント(Windows 10/CLion) –

1

私は前にこれで問題がありました。ここで

は、私は1つのプロジェクトにしたものです。何らかの理由でb2(別名bjam)が先頭の "lib"を持つブーストライブラリを作成しました。 cmakeスクリプトは、libboost_thread.libという名前のファイルを探しません。boost_thread.libしか見つかりません。先頭のlibを削除し、cmakeが見つかるはずです。

+0

を追加しても、私はそれを試みましたが、助けにはなりませんでした。この名前は、libboost_serializationではなくboost_serialization-vc90-mt-1_47.libのようなものです-vc90-mt-1_47.lib - さらにいくつかのライブラリを使いたいのであれば、それらの名前をすべて変更してcmakeがそれらを見つけることはできません。私の意見では、find_packageは私のためにすべての作業を行う必要があります... – JonathanK

+3

libsの名前を変更しないでください。 "lib"プレフィックスは静的ライブラリ用です。プレフィックスはDLL用ではありません。代わりにruntime-link = sharedを使用してビルドする必要があります。 –

+0

@AndreasHaferburg私の場合、私は特に私のアプリケーションに静的リンクブーストを試みていました。 –

0

あなたは、静的ブーストライブラリを使用するCGALを伝えるためにcmakeののコマンドラインに以下のオプションを追加することができます。

-DCGAL_Boost_USE_STATIC_LIBS=true 
0

は、同様の問題でここに来て、ちょうど私の修正が類似していた言いたかったではなく、まったく同じ。私のインストールプレフィックスはC:\ lib \ boost \ boost_1_57_0でした。そのディレクトリを指しているBOOST_ROOT環境変数を設定しましたが、CMake(3.1.0)はまだヘッダを見つけることができませんでした。 C:\ lib \ boost \ boost_1_57_0 \ include \ boost-1_57 \ boostにインストールするようにデフォルト設定されていることを認識しました。

C:\lib\boost\boost_1_57_0\include\boost 

そして、CMakeのはすべてが見つかりました:私はちょうどダウン1最終ブーストディレクトリを移動し、ブースト-1_57ディレクトリを削除し、ここでのヘッダーになってしまったように、複数のバージョンを実行するつもりはありません。

関連する問題