114

ほとんどの場合、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(.)orなどのさまざまなことも同様add_library(bingitup STATIC IMPORTED)ですが、これまでのところ、リンクが成功するものはありません。私は何をすべきですか?


バージョンの詳細: GCC 4.6.3 を使用する Linux (Kubuntu 12.04) 上の CMake 2.8.7

4

4 に答える 4

141

CMake はリンク ライブラリへのフル パスを渡すことを優先するため、libbingitup.a が にあると仮定すると${CMAKE_SOURCE_DIR}、次の操作が成功するはずです。

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)
于 2012-12-29T02:39:38.143 に答える
38

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

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/)
于 2017-01-05T21:42:01.857 に答える
26

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

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)
于 2015-07-21T16:20:19.350 に答える
1

他のコメントに追加したいのですが、プロジェクト名は最初の引数です。cmakecompile というプロジェクトがあり、それに libusb を追加したかったのですが、コードは次のとおりです。

add_executable(cmakecompile main.c)
target_link_libraries(cmakecompile "D:/msys2/mingw64/lib/libusb-1.0.a")

プロジェクトには main.c ファイルしかありませんでした。target_link_libraries の最初のパラメーターはプロジェクトの名前で、2 番目のパラメーターはライブラリのパスです

役立つかもしれないことに注意してください:私はWindowsでコンパイルしているので、同じコンパイラでライブラリをコンパイルする必要があるため、msys2をインストールする必要がありました。たとえば、libusbを取得して qt-creator プロジェクトで使用しようとすると、機能せず、参照されていない関数が取得される可能性があるため、msys2 をインストールし、msys2 内から libusb をインストールし、make をインストールして QT Cmake プロジェクトを作成する必要がありましたmsys2 make を使用して Qt クリエーターからコンパイルします。

完全な cmakelists.txt は次のとおりです。

cmake_minimum_required(VERSION 3.5)

project(cmakecompile LANGUAGES C)

add_executable(cmakecompile main.c)
target_link_libraries(cmakecompile "D:/msys2/mingw64/lib/libusb-1.0.a")
于 2021-03-07T11:31:16.497 に答える