6

ubuntuで(cmake/catkinを使用して)コンパイルして正常に実行する(比較的)大きなプロジェクトC ++があります。Mac OS では正常にコンパイルされますが、実行可能ファイルを起動しようとすると、次のエラー メッセージが表示されます。

dyld: Library not loaded: <name of library>.dylib
  Referenced from:
  <path to executable>/<executable>
Reason: image not found

コマンドを実行する場合:

otool -l <executable> | grep LC_RPATH -A2

出力が得られます:

      cmd LC_RPATH
  cmdsize 64
     path <correct absolute path to folder containing library> (offset 12)

      cmd LC_RPATH
  cmdsize 24
     path /sw/lib (offset 12)

      cmd LC_RPATH
  cmdsize 32
     path /usr/X11/lib (offset 12)

      cmd LC_RPATH
  cmdsize 32
     path /opt/local/lib (offset 12)

      cmd LC_RPATH
  cmdsize 32
     path /opt/X11/lib (offset 12)

ライブラリが見つからない理由は非常に不明です。ランニング:

otool -L <executable>

プリント:

<executable name>:
    <library name>.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /opt/X11/lib/libglut.3.dylib (compatibility version 13.0.0, current version 13.0.0)
    /opt/X11/lib/libGL.1.dylib (compatibility version 1.2.0, current version 1.2.0)
    /opt/X11/lib/libGLU.1.dylib (compatibility version 1.3.0, current version 1.3.0)
    /opt/X11/lib/libX11.6.dylib (compatibility version 10.0.0, current version 10.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

これは、正しいパスが取得されていないことを確認しているようです。

私が欠けているものはありますか?

PS:

関連性があるかどうかわからない、ここで私が使用したcmakeコマンド:(ここから)

# use, i.e. don't skip the full RPATH for the build tree
SET(CMAKE_SKIP_BUILD_RPATH  FALSE)

# when building, don't use the install RPATH already
# (but later on when installing)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)

SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib/${MACHTYPE}")

# add the automatically determined parts of the RPATH
# which point to directories outside the build tree to the install RPATH
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

# the RPATH to be used when installing, but only if it's not a system directory
LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib/${MACHTYPE}" isSystemDir)
IF("${isSystemDir}" STREQUAL "-1")
    SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib/${MACHTYPE}")
ENDIF("${isSystemDir}" STREQUAL "-1")
4

1 に答える 1

2

回答はここからのコメントから来ました

@rpath を使用する必要があります

実際、Mac OS X には rpath の概念があります。10.4 より前は、実行可能バイナリの場所を指す @executable_path のみがありました (ロードされた dylib とは対照的に)。@loader_path は 10.4 で導入され、dylib がその場所に基づいて依存関係をロードできるようになりました (実行可能ファイルの場所ではなく、ライブラリを使用しているものを知っている人はいません)。

10.5 Apple では、読み込みバイナリ (実行可能ファイルまたはライブラリ) に焼き付けられる @rpath が導入されました。@loader_path/../../Library/Frameworks/blah.dylib の代わりに、@rpath/Library/Frameworks/blah.dylib が表示される場合があります。

これは、rpath が に設定されている場合を意味します。そして / ./Library/Frameworks/blah.dylib を調べてから、ライブラリの /Library/Frameworks/blah.dylib を調べます。

于 2015-09-11T16:27:37.383 に答える