ソースディレクトリの静的ライブラリにリンクするようにCMakeに指示するにはどうすればよいですか?


96

主にCMakeの経験を積むために、CMakeに変換しようとしているMakefileを使用した小さなプロジェクトがあります。この例の目的のために、プロジェクトにはソースファイル(C ++、言語は特に関連性があるとは思いませんが)と他の場所からコピーした静的ライブラリファイルが含まれています。議論のために、ライブラリのソースコードが利用できないと仮定します。.aファイルと対応するヘッダーしかありません。

私の手作りのMakefileには、次のビルドルールが含まれています。

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

これは正常に動作します。これを再現するようにCMakeに指示するにはどうすればよいですか?もちろん、文字通りこの正確なmakefileではありませんが、同等のリンクコマンドを含むものです。私は明白ですが素朴な方法を試しました

add_executable(main main.cpp libbingitup.a)

または

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

link_directories(.)またはとさまざまなものadd_library(bingitup STATIC IMPORTED)などこれまでのところ何も成功したリンクでの結果という。私は何をすべきですか?


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

回答:


121

CMakeはリンクライブラリへのフルパスを渡すことを好むので、libbingitup.aがにある${CMAKE_SOURCE_DIR}と仮定すると、以下を実行すると成功するはずです。

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

2
素晴らしい、それはうまくいきます、ありがとう!...それはここで明示的に完全なパスに入れて持っている少しハックようだが、私はそれがちょうどCMakeの道だと思う
デヴィッド・Z

4
ここではやり過ぎのように思えますが、同じlibの複数の異なるバージョンがインストールされている場合は、フルパスを明示的に指定することで利益が得られます。
フレイザー

1
いつものようにすごい!私の場合、静的ライブラリに依存していた別のビルドされた動的ライブラリに依存するライブラリの問題を解決しました。依存するライブラリもこの静的ライブラリにリンクしようとしていました。
アントニオ

1
mainはインクルードディレクトリをどのように知っていますか?
ManuelSchneid3r 2016年

3
target_include_directoriesまたはを使用する必要がありますinclude_directories(より具体的であるため、前者が推奨される方法です)。
フレイザー

31

フルパスを含めたくない場合は、次のことができます。

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

bingitup CMakeプロジェクトで静的ライブラリを作成する場合にターゲットに付ける名前と同じです。

add_library(bingitup STATIC bingitup.cpp)

CMakeは、Linuxの場合libは前面と末尾に、Windowsの場合は末尾に自動的にを追加します。.a.lib

ライブラリが外部の場合は、を使用してライブラリへのパスを追加することをお勧めします

link_directories(/path/to/libraries/)

1
また、同じ名前の.aファイルと.soファイルがある場合、この場合は.aまたは.soに対してリンクするように指定しますか?
ジョージ

1
@ジョージ:できません。両方のタイプが存在する場合は、リンク先のファイルのフルネームを含めてください。
CrisLuengo19年

21

これは役に立ちました...

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)

3
INCLUDE_DIRECTORIESはどうですか?
KYB

1
これは、ライブラリがcmakeビルドの一部である場合にのみ機能しますが、外国のライブラリは機能しません
eigenfield

質問には、「プロジェクトには、ソースファイル(C ++、言語は特に関連性があるとは思わないが)と、他の場所からコピーした静的ライブラリファイルが含まれている」と書かれています。
stu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.