2017-03-09 10 views
0

私は比較的新しいCMakeです。私はexternal_libraryという名前の共有ライブラリにリンクするライブラリを構築する小さなプロジェクトを開発しました。cmake: "make install"はUbuntuのライブラリとリンクしません

cmake_minimum_required(VERSION 2.8.12) 
project(project_name) 

include_directories(path_to_external_library_source_code) 
add_subdirectory(path_to_external_library_header_files subproject/external_library) 

target_link_libraries(project_name external_library) 
install(TARGETS project_name DESTINATION installation_path) 

私は(makeを使用して)プロジェクトをビルドするとき、それは完璧に動作し、それは(私がlddコマンドでそれをチェックして)正しくリンクを作成します。私のCMakeLists.txtファイルには、次のようになります。ただし、インストールしようとすると(make install)、インストールパスに生成されたファイルは指定された共有ライブラリとリンクされません。

lddを再度使用して、インストールパスで生成されたライブラリで共有ライブラリが見つからないことを確認しましたが、ビルドパスで生成されたライブラリにあります。どうすればこの問題を解決できますか?

ありがとうございました。

Pd:Ubuntu 16.04.2 LTSCMake 3.5.1を使用しています。

私は問題はこのような何かをやって、構築された共有ライブラリのパスを指定して、コマンド find_libraryを使用して解決することができることを見出した
+1

'add_subdirectory(path_to_external_library_header_filesサブプロジェクト/外部ライブラリ)'とは何と思いますか? 'path_to_external_library_header_files'にCMakeLists.txtファイルがありますか?なぜあなたのプロジェクトの一環として外部ライブラリをbulldしようとしていますか? – kdopen

+0

はい、共有ライブラリの '.cpp'ファイルと' .h'ファイルをプロジェクトに追加する 'path_to_external_library_header_files'に' CMakeLists.txt'があります。 – GLR

+0

私は共有ライブラリを作成したライブラリの一部にしたいので、 'add_subdirectory'を使用しています(私はそれを正しくやっていればいいと思います)。 – GLR

答えて

0

cmake_minimum_required(VERSION 2.8.12) 
project(project_name) 

include_directories(path_to_external_library_source_code) 
find_library(LIBNAME LibName_1 LibName_2 HINTS built_lib_directory)  

target_link_libraries(project_name ${LIBNAME}) 
install(TARGETS project_name DESTINATION installation_path) 
1

共有ライブラリはで構成され、特定のパスで探され/etc/ld.so.conf

共有ライブラリがこれらのパスのいずれかにある場合は、そのパスが見つかるはずです。

  1. があなたの権限与えられた実験的なソフトウェアとの望ましい、あるいはできない場合がありますシステムのデフォルトのパスにインストールライブラリ(持つ:それはこれらのパスのいずれかでない場合は、4つのオプションを持っています);
  2. それは、システムの検索パスをオーバーライドするようLD_LIBRARY_PATHを設定、編集、システム全体の検索パス(による権限に可能なシステム全体の設定に触れ、そしておそらくないのは本当に望ましくない)、
  3. (推奨されません、それは基本的なデバッグ機能です)、または
  4. RPATHを設定します。つまり、ライブラリを探す場所をバイナリに "伝える"/"ハードコーディング"します。

何が起こるかというとCMakeの自動的${CMAKE_BINARY_DIR}を建設プロジェクトから共有ライブラリを参照するために、あなたのバイナリのRPATHを設定していることです。 (あなたがちょうど作成したライブラリに対してバイナリではなく、あなたが昨日のインストール1をテストしたい。)

デフォルトでは、このRPATHの設定はmake installクリアされていない(そう${CMAKE_BINARY_DIR}でライブラリが参照されなくなって、代わりにシステムの検索パスで検索します)。

システム検索パスのではないのインストール先であると仮定すると、バイナリはその共有ライブラリをもう見ないようになります。 CMake RPATH handling に問い合わせて、CMakeがバイナリのRPATHを共有ライブラリのインストールパスに設定するようにしてください。

関連する問題