2012-12-29 25 views
40

私はCMakeに変換しようとしているMakefileの小さなプロジェクトを持っています。ほとんどの場合CMakeの経験を得るためです。この例の目的のために、プロジェクトにはソースファイル(C++、特に言語は関係ないと思いますが)と、他の場所からコピーした静的ライブラリファイルが含まれています。議論のために、ライブラリへのソースコードが利用できないと仮定します。私は.aファイルと対応するヘッダーのみを持っています。正常に動作しますCMakeがソースディレクトリの静的ライブラリにリンクするようにするにはどうすればよいですか?

main: main.o libbingitup.a 
    g++ -o main main.o libbingitup.a 

私の手作りのMakefileは、このビルドルールが含まれています。これを再現するにはどうすればよいですか?文字通りこの正確なmakefileではなく、同等のリンクコマンドを含むものです。私は成功したリンケージにlink_directories(.)またはadd_library(bingitup STATIC IMPORTED)など何もこれまでのところ、その結果と

add_executable(main main.cpp libbingitup.a) 

または

add_executable(main main.cpp) 
target_link_libraries(main libbingitup.a) 

だけでなく、様々なもののように、明らかしかしナイーブな方法を試してみました。私は何をしなければならないのですか?


バージョンの詳細:GCC 4.6.3でLinux上にCMake 2.8.7(Kubuntuの12.04)

答えて

60

CMakeのは、ライブラリをリンクするための完全なパスを渡す好む、そう、libbingitup.aが${CMAKE_SOURCE_DIR}であると仮定すると次成功する必要があります。

add_executable(main main.cpp) 
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a) 
+1

グレートを使用して、ライブラリーへのパスを追加したい場合があります!ここで明示的に完全なパスを入れなければならないのはちょっとハックしたようですが、私はそれがちょうどCMakeの方法だと思っています... –

+2

ここでは残念ですが、明示的に完全パスを指定することは複数の異なるバージョンインストールされている同じlibの – Fraser

+0

いつものようにすごい!私の場合は、スタティックライブラリに依存していた別のビルドされたダイナミックライブラリに応じてライブラリの問題を解決しました。依存するライブラリもこのスタティックライブラリにリンクしようとしていました。 – Antonio

10

私はこの便利...

http://www.cmake.org/pipermail/cmake/2011-June/045222.html

を見つけ

彼らの例から:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED) 
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a) 
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C) 
+0

は完璧に機能します。ありがとう –

7

あなたは完全なパスを含めるしたくない場合は、

add_executable(main main.cpp) 
target_link_libraries(main bingitup) 

bingitupを行うことができ、作成した場合は、ターゲットを与えるだろうと同じ名前でありますcmakeのプロジェクトでの静的ライブラリ:

add_library(bingitup STATIC bingitup.cpp) 

cmakeのは、自動的にlibとを追加Linuxの場合は、Windowsの場合は.libとなります。ライブラリが外部の場合

は、あなたが、おかげで動作します

link_directories(/path/to/libraries/) 
関連する問題