私はUbuntuで、私はcmakeとmakeについて学び、単純な例を試しています。 src
とbuild
の2つのディレクトリがあります。 src
には、2つのファイルがあります:_main.cpp
_、および_CMakeLists.txt
_には、次のテキスト(のみ)があります。
_add_executable(test main.cpp)
link_directories(/usr/lib/x86_64-linux-gnu)
target_link_libraries(test protobuf)
_
_/usr/lib/x86_64-linux-gnu
_には、リンクしたい_libprotobuf.so
_という共有ライブラリがあります。私の_main.cpp
_は、関連するヘッダーファイル_#include <google/protobuf/message.h>
_を含めることにより、このライブラリの関数を使用します。
今、私のbuild
ディレクトリで、_cmake ../src
_を実行し、次にmake
を実行します。ただし、protobufライブラリの一部の関数への未定義の参照があることを示すリンカーエラーが表示されます。 build
内のすべてのファイルとサブディレクトリを検索した場合、protobufに関連することは何も言及されていません。
ただし、_link_directories
_ファイルの_CMakeLists.txt
_行を削除し、代わりに実行可能ファイル、つまりtarget_link_libraries(test /usr/lib/x86_64-linux-gnu/libprotobuf.so)
を指定するときにライブラリへのフルパスを書き込むと、コンパイルとリンクが正常に行われます。
なぜ_link_directories
_でcmakeがこのライブラリを見つけることができないのですか?
CMakeでこのように_link_directories
_を使用しないでください。
これは、他の多くのビルド環境がこのように機能するため、一般的な初心者の間違いですが、CMakeでは、単にトラブルを求めているだけです。でも マンページ はそれに対して特にアドバイスしています:
このコマンド[_
link_directories
_]はほとんど必要ないことに注意してください。find_package()
およびfind_library()
によって返されるライブラリの場所は絶対パスです。これらの絶対ライブラリファイルパスをtarget_link_libraries()
コマンドに直接渡します。 CMakeは、リンカがそれらを確実に検出するようにします。
代わりに、常に絶対パスを_target_link_libraries
_に渡し、 _find_library
_ を使用してリンクディレクトリを解決します:
_find_library(PROTOBUF_LIBRARY protobuf HINTS /usr/lib/x86_64-linux-gnu)
target_link_libraries(test PUBLIC ${PROTOBUF_LIBRARY})
_
これには、コンパイル時のランダムリンカーエラーの代わりに、予想されるライブラリが見つからない場合に、おそらくCMake構成時に診断を得るという大きな利点があります。また、これにより、ターゲットマシンのディレクトリレイアウトが非標準の場合、ユーザーはGUIを介してライブラリの場所を指定できます。
すぐに動作しない場合は、_find_library
_呼び出しの結果を確認し、意図したとおりにライブラリが見つからない理由を追跡するためにマンページを参照してください。
link_directories
が行われます電話の前該当するadd_executable
。
私は、それがtarget_link_libraries
、しかしそうではありません。呼び出しを移動した後、ライブラリは適切にリンクされます。
順序がlink_directoriesであることを確認し、PROJECT_LINK_LIBS、add_executable、target_link_librariesの順に設定します。
以下は、デモを開始する例です。
cmake_minimum_required(VERSION 2.8.9)
project (Logging)
include_directories(include)
file(GLOB LOGGINGSOURCES "libsrc/*.cpp")
file(GLOB SOURCES "src/*.cpp")
add_library(convertString SHARED ${LOGGINGSOURCES})
install(TARGETS convertString DESTINATION /root/Deepak/)
link_directories( /root/Deepak/ )
set(PROJECT_LINK_LIBS libconvertString.so)
add_executable(hello ${SOURCES})
target_link_libraries(hello ${PROJECT_LINK_LIBS} )