2012-01-16 26 views
2

私は数回前にこれをやったことがありますが、どういうわけか今回は固まっています。私は実行可能な "myapp"と独自の共有ライブラリ "mylib"を持っています。私のcmakelistsでは、私は以下の持っている:Cmake:リンク共有ライブラリ

ADD_LIBRARY(mylib SHARED ${SOURCES_LIB}) 
INSTALL(TARGETS mylib DESTINATION .) 
ADD_EXECUTABLE(myapp ${SOURCES_APP}) 
TARGET_LINK_LIBRARIES(myapp ${QT_LIBRARIES} mylib) 
INSTALL(TARGETS myapp DESTINATION .) 

すべてが正しくコンパイルとリンクが、私はmyappのを起動したとき、私は次のエラーを取得:

error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory 

libと実行ファイルがインストール中に存在しているがディレクトリ。私は上記のcmakelistsの最初の行を変更することによって、私のライブラリを静的にするとき:

ADD_LIBRARY(mylib STATIC ${SOURCES_LIB}) 

その後、すべてが100%に動作します。

誰かが間違っていることを知っていますか?

答えて

3

ライブラリと実行可能ファイルのインストール中に、ライブラリを見つけるためのランタイムパスが実行ファイルから削除されます。したがって、ライブラリはランタイムライブラリの検索パスに存在する必要があります。たとえば、Linuxでは、LD_LIBRARY_PATHを、実行ファイルを起動するときにインストールされたライブラリを含むディレクトリに設定してください。

+9

cmakeのは、あなたが設定することができます。 SET(CMAKE_INSTALL_RPATH "$ {CMAKE_INSTALL_PREFIX}/libfolder") libfolderは共有ライブラリがインストールされているディレクトリです。これはUnixシステムでのみ有効です。私はWindows用のものも見つけようとします。 – goocreations

-1

"make install"に関するよくある質問です。実際には、ライブラリを実行可能ファイルにリンクする3つの方法があります。 Frist、単純なケースでは-l -Lフラグを使用できます。 BenjaminはLD_LIRARY_PATHを使用して、export LD_LIBRARY_PATH=/usr/local/my_libのようなものを書くと言っています。実際、これは良い方法ではありません。 RPATHを使用するほうがはるかに優れています。​​に関する非常に有用なドキュメントページがあります。見てみな。あなたはトップレベルCMakeLists.txtでこのような何かを書く場合まあ、それは問題を解決します:

SET(CMAKE_SKIP_BUILD_RPATH FALSE) 
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64") 
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64") 
+0

いいえ、そうではありません。それはcmakeとldの経路に関する非常に具体的な質問です。また、あなたの答えは形式が整っておらず、またそれがなぜ機能するのか説明していません。回答を他の場所にリンクするだけでなく、関連する部分を要約してください。 – nonchip

関連する問題