web-dev-qa-db-ja.com

Cmakeは「link_directories」を使用してライブラリを見つけることができません

私はUbuntuで、私はcmakeとmakeについて学び、単純な例を試しています。 srcbuildの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がこのライブラリを見つけることができないのですか?

40
Karnivaurus

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_呼び出しの結果を確認し、意図したとおりにライブラリが見つからない理由を追跡するためにマンページを参照してください。

56
ComicSansMS

link_directoriesが行われます電話の前該当するadd_executable

私は、それがtarget_link_libraries、しかしそうではありません。呼び出しを移動した後、ライブラリは適切にリンクされます。

42
aardvarkk

順序が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} )
1
user6882413