web-dev-qa-db-ja.com

外部ライブラリへのCMakeリンク

CMakeを実行して、同じCMakeプロジェクト内でビルドされていない外部共有ライブラリに実行可能ファイルをリンクするにはどうすればよいですか?

target_link_libraries(GLBall ${CMAKE_BINARY_DIR}/res/mylib.so)を実行するだけでエラーが発生します

make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'.  Stop.
make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2
make: *** [all] Error 2
(GLBall is the executable)

ライブラリをバイナリディレクトリbin/resにコピーした後。

find_library(RESULT mylib.so PATHS ${CMAKE_BINARY_DIR}/res)を使用してみました

RESULT-NOTFOUNDで失敗します。

98
Prime

最初にライブラリの検索パスを設定します。

LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res)

それから

TARGET_LINK_LIBRARIES(GLBall mylib)
88
arrowd

arrowdodgerの答えは正解であり、多くの場合好まれます。私は単に彼の答えに代替物を加えたいと思います:

リンクディレクトリの代わりに、「インポートされた」ライブラリターゲットを追加できます。何かのようなもの:

# Your-external "mylib", add GLOBAL if the imported library is located in directories above the current.
add_library( mylib SHARED IMPORTED )
# You can define two import-locations: one for debug and one for release.
set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/res/mylib.so )

そして、このライブラリがプロジェクトによって構築されたかのようにリンクします。

TARGET_LINK_LIBRARIES(GLBall mylib)

このようなアプローチにより、柔軟性が少し向上します。 add_library() コマンドと インポートされたライブラリに関連する多くのターゲットプロパティ を見てください。

「libsの更新されたバージョン」の問題がこれで解決するかどうかはわかりません。

107
André

fooと呼ばれるライブラリにリンクしたい場合、そのファイル名は通常foo.dllまたはlibfoo.soにリンクされています。

1。ライブラリを見つける
ライブラリを見つける必要があります。ライブラリへのパスを知っていても、これは良い考えです。ライブラリが消滅した場合、または新しい名前を取得した場合、CMakeはエラーを出します。これは、エラーを早期に発見し、問題の原因をユーザー(おそらく自分自身)に明らかにするのに役立ちます。
ライブラリfooを見つけて、FOO_LIBにパスを保存するには

    find_library(FOO_LIB foo)

CMakeは、実際のファイル名がどのようになっているのかを把握します。 /usr/lib/usr/lib64などの通常の場所と、PATHのパスをチェックします。

ライブラリの場所はすでにわかっています。 CMakeを呼び出すときにCMAKE_PREFIX_PATHに追加すると、CMakeは渡されたパスでもライブラリを探します。

ヒントまたはパスサフィックスを追加する必要がある場合があります。詳細については、ドキュメントを参照してください。 https://cmake.org/cmake/help/latest/command/find_library.html

2。ライブラリをリンクします1.から、FOO_LIBに完全なライブラリ名があります。これを使用して、次のようにライブラリをターゲットmylibにリンクします

  target_link_libraries(mylib "${FOO_LIB}")

ライブラリの前にPRIVATEPUBLIC、またはINTERFACEを追加できます。ドキュメント: https://cmake.org/cmake/help/latest/command/target_link_libraries.html

3。インクルードを追加(このステップは必須ではないかもしれません。)
ヘッダーファイルも含める場合は、find_pathと同様のfind_libraryを使用して、ヘッダーファイルを検索します。次に、target_include_directoriesに似たtarget_link_librariesを含むインクルードディレクトリを追加します。

ドキュメント: https://cmake.org/cmake/help/latest/command/find_path.html および https://cmake.org/cmake/help/latest/command/target_include_directories .html

外部ソフトウェアで使用可能な場合は、find_libraryfind_pathfind_packageに置き換えることができます。

41
usr1234567

もう1つの選択肢は、Appstoreで作業している場合、「資格」が必要であるため、Apple-Frameworkとリンクする必要があります。

エンタイトルメントが機能するように(例:GameCenter)、need「ライブラリとバイナリをリンク」-buildstepし、「GameKit.framework」とリンクする必要があります。 CMakeは、ライブラリを「低レベル」でコマンドラインに「インジェクト」するため、Xcodeはreallyを知らないため、notCapabilities画面でGameKitを有効にします。

CMakeを使用して「Link with Binaries」-buildstepを使用する1つの方法は、CMakeでxcodeprojを生成し、「sed」を使用して「検索と置換」を行い、XCodeが好む方法でGameKitを追加することです...

スクリプトは次のようになります(Xcode 6.3.1の場合)。

s#\/\* Begin PBXBuildFile section \*\/#\/\* Begin PBXBuildFile section \*\/\
    26B12AA11C10544700A9A2BA \/\* GameKit.framework in Frameworks \*\/ = {isa = PBXBuildFile; fileRef = 26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/; };#g

s#\/\* Begin PBXFileReference section \*\/#\/\* Begin PBXFileReference section \*\/\
    26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameKit.framework; path = System\/Library\/Frameworks\/GameKit.framework; sourceTree = SDKROOT; };#g

s#\/\* End PBXFileReference section \*\/#\/\* End PBXFileReference section \*\/\
\
\/\* Begin PBXFrameworksBuildPhase section \*\/\
    26B12A9F1C10543B00A9A2BA \/\* Frameworks \*\/ = {\
        isa = PBXFrameworksBuildPhase;\
        buildActionMask = 2147483647;\
        files = (\
            26B12AA11C10544700A9A2BA \/\* GameKit.framework in Frameworks xxx\*\/,\
        );\
        runOnlyForDeploymentPostprocessing = 0;\
    };\
\/\* End PBXFrameworksBuildPhase section \*\/\
#g

s#\/\* CMake PostBuild Rules \*\/,#\/\* CMake PostBuild Rules \*\/,\
            26B12A9F1C10543B00A9A2BA \/\* Frameworks xxx\*\/,#g
s#\/\* Products \*\/,#\/\* Products \*\/,\
            26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/,#g

これを「gamecenter.sed」に保存してから、このように「適用」します(xcodeprojが変更されます!)

sed -i.pbxprojbak -f gamecenter.sed myproject.xcodeproj/project.pbxproj

必要に応じてスクリプトコマンドを変更する必要がある場合があります。

警告:プロジェクト形式が変更される可能性があるため、異なるXcodeバージョンで壊れる可能性が高く、(ハードコード化された)一意の番号は実際には一意ではない場合があり、一般的に他の人のソリューションの方が優れているため、Appstore +をサポートする必要がない限り資格(および自動ビルド)、これをしないでください。

これはCMakeのバグです。 http://cmake.org/Bug/view.php?id=14185 および http://gitlab.kitware.com/cmake/cmake/を参照してください。 issues/14185

3
kalmiya