2012-03-30 6 views
14

を返します::私のCMakeLists.txtに次のコードを使用してprogram_optionsCMakeのFIND_PACKAGEは私が後押しするCMakeの2.8.6のリンクを持ってしようとしている成功したが、間違ったパス

FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED) 
INCLUDE_DIRECTORIES (${Boost_INCLUDE_DIR}) 

ADD_EXECUTABLE (segment segment.cpp) 
TARGET_LINK_LIBRARIES (segment ${Boost_LIBRARIES}) 

findコマンドが成功するようだが、合格しますリンカーに間違ったディレクトリ。次

`/usr/lib64/libboost_program_options-mt.so.5` 

しかしCMakeFiles/segment.dir/link.txtリスト:パス内の余分なlib64

/cm/shared/apps/gcc/4.4.6/bin/c++  CMakeFiles/segment.dir/segment.cpp.o -o segment -rdynamic /usr/lib64/lib64/libboost_program_options-mt.so.5 -lpthread -lrt -Wl,-rpath,/usr/lib64/lib64 

注パッケージが実際にあります。また、パスの前にある-lフラグが欠落しているようです。

CMakeのを実行している場合は、それが正しくパッケージを見つけ、{$Boost_LIBRARIES}変数が正しいLIBSを一覧表示するようだと報告し:

Boost found. 
Found Boost components: 
    program_options 
${Boost_LIBRARIES} - optimized;boost_program_options-mt-shared;debug;boost_program_options-mt-shared-debug 

生成CMakeCache.txtファイルで始まる:

//The directory containing a CMake configuration file for Boost. 
Boost_DIR:PATH=/usr/lib64/boost 

//Boost include directory 
Boost_INCLUDE_DIR:FILEPATH=/usr/include 

それは正しいと思われる。しかし、実行している場合は、それが上記のlink.txtでパスを使用しますと、私はエラーを取得する:

make[2]: *** No rule to make target `/usr/lib64/lib64/libboost_program_options-mt.so.5', needed by `segment'. Stop. 
make[1]: *** [CMakeFiles/segment.dir/all] Error 2 
make: *** [all] Error 2 

パスにサブディレクトリのこの余分な注入を引き起こす可能性がありますか?このようにしてlink.txtが生成される原因は何ですか?そして、私はそれを修正する(または回避する)方法はありますか?

+0

CMakeLists.txtに 'FIND_PACKAGE'と' FIND_PACKAGE'の後に 'MESSAGE(" \ $ {Boost_LIBRARIES} - $ {Boost_LIBRARIES} ")'を追加できますか?次に、CMakeCache.txtを削除し、CMakeを実行して出力をあなたの質問の編集として貼り付けます。 – Fraser

+0

@Fraser正しいライブラリが見つかったようです。ここには出力もあります(上記も含まれています): '$ {Boost_LIBRARIES} - 最適化; boost_program_options-mt-shared; debug; boost_program_options-mt-shared-debug' – CvW

+0

回避策として、手動でリンクパスを設定するにはどうすればよいですか? – CvW

答えて

24

、この問題が発生します。

問題は、cmakeコマンドラインで-DBoost_NO_BOOST_CMAKE=ONを指定することで回避できます。

この問題が導入された実際のコミットは、7da796d1fdd7cca07df733d010cd343f6f8787a9です。これはviewed hereです。

4

これはCentOSのCMake 2.8.6の問題であるようです。 2.6.4または2.8.3と同じことをするとき、正しく動作します。また、OS Xの2.8.7では正しく動作します。

3

私はまた、CentOSの64ビット6.2

+0

そして2.8.3にバックアップしてもそれを固定しました。 – KyleL

+0

私はバグをここに提出しました:http://public.kitware.com/Bug/view.php?id=13446 – KyleL

7

を使用して、プリコンパイルされcmakeのバージョン2.8.8の問題は、問題がブースト-develの分散ファイルである参照します。/ usr/lib64に/ブースト/ブースト-relwithdebinfo .cmake

FindBoost.cmakeファイルは、完全なパスをブーストライブラリに返すため、cmake-2.6パッケージはこのファイルをまったく使用しません。 cmake28-2.8.8 FindBoost.cmakeファイルは、 "boost_date_time-mt-shared"のようなライブラリ文字列を返します。これらは、/usr/lib64/boost/Boost-relwithdebinfo.cmakeで定義されたターゲットです。 /usr/lib64/boost/Boost-relwithdebinfo.cmakeの最上部に

は、_IMPORT_PREFIXという名前の変数はcmakeのファイル自体の場所から定義され、そしてそのようにように使用されている:

#---------------------------------------------------------------- 
# Generated CMake target import file for configuration "RelWithDebInfo". 
#---------------------------------------------------------------- 

# Commands may need to know the format version. 
SET(CMAKE_IMPORT_FILE_VERSION 1) 

# Compute the installation prefix relative to this file. 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) 

# Import target "boost_date_time-static" for configuration "RelWithDebInfo" 
SET_PROPERTY(TARGET boost_date_time-static APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO) 
SET_TARGET_PROPERTIES(boost_date_time-static PROPERTIES 
    IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib64/libboost_date_time.a" 
) 

これにより、_IMPORT_PREFIXが "/ usr/lib64"に設定されます。これは/ lib64 /を持つ別の文字列と連結されます。 3番目のGET_FILENAME_COMPONENT呼び出しを含めるようにファイルを変更するだけで正常に動作することがわかりました。これと同じように:ブーストパッケージ発見コードが変更されたcmake-2.8.6-rc2以降、とブーストの一部の古いバージョンを使用している場合

#---------------------------------------------------------------- 
# Generated CMake target import file for configuration "RelWithDebInfo". 
#---------------------------------------------------------------- 

# Commands may need to know the format version. 
SET(CMAKE_IMPORT_FILE_VERSION 1) 

# Compute the installation prefix relative to this file. 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) 

# Import target "boost_date_time-static" for configuration "RelWithDebInfo" 
SET_PROPERTY(TARGET boost_date_time-static APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO) 
SET_TARGET_PROPERTIES(boost_date_time-static PROPERTIES 
    IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib64/libboost_date_time.a" 
) 
+0

これは、ほとんどのautohellよりも良いCMakeについて何ですか?私はこれを読んでしまうまで、何週間も髪を引っ張ってしまった。 – noobermin

0

私が追加、これは私が手cmakeの実行時に定義するために承認された答えが満足のいくようではありませんブースト-1.41.0-18.el6.x86_64

とcmakeのバージョン2.8.11.2でこの問題に気づい:

CMakeの警告: 手動-指定された変数は、プロジェクトで使用されなかった。

Boost_NO_BOOST_CMAKE 

私が原因十分stackoverflowのに参加していないにコメントやdownvoteように見えることはできません。それは鶏と卵の問題です!

私はカイマイヤーによる説明をupvoteすることもできません。しかし、私はこれが本当に問題を説明していると思います。

要約すると、CMakeによって提供されたFindBoost.cmakeが突然Boostを見つけることができないように見えるので、findコードは、今度はboostを提供しているcmakeのスクリプトを検索しています。バグがあり、正しいパスを返さないようです。

関連する問題