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
で失敗します。
最初にライブラリの検索パスを設定します。
LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res)
それから
TARGET_LINK_LIBRARIES(GLBall mylib)
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の更新されたバージョン」の問題がこれで解決するかどうかはわかりません。
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}")
ライブラリの前にPRIVATE
、PUBLIC
、または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_library
とfind_path
をfind_package
に置き換えることができます。
もう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