【问题标题】:Setting the Search Path for Plug In (Bundle / DyLib)设置插件的搜索路径(Bundle / DyLib)
【发布时间】:2017-03-12 03:16:19
【问题描述】:

我正在 OS X 上创建一个 Photoshop 插件(基本上是一个 Bundle / DyLib)。
我正在使用英特尔编译器并通过链接到 OpenMP (libiomp5) 来使用 OpenMP。
当我使用静态链接时,它会使 Photoshop 崩溃(仅在 OS X 上,在 Windows 上有效)。
所以我尝试了动态链接。

主机 Photoshop 自己使用 libiomp5.dylib,它位于其 Framework 文件夹中。
因此,在 Xcode 上,我将链接部分的 Runpath Search Paths 设置为 @executable_path/../Frameworks/,但是当我尝试在 Photoshop 上加载它时它不起作用。
我还尝试将Runpath Search Paths 设置为Intel Run Time Redistributable Libraries(其中包括根据MacDependency 的插件所需的所有 DyLib,就像 Photoshop 的框架库一样)但它仍然无法在 Photoshop 上加载。

当我在插件上使用 otool -L 时,我得到:

/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 157.0.0)
    libimf.dylib (compatibility version 0.0.0, current version 0.0.0)
    libsvml.dylib (compatibility version 0.0.0, current version 0.0.0)
    libirng.dylib (compatibility version 0.0.0, current version 0.0.0)
    libiomp5.dylib (compatibility version 5.0.0, current version 5.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    libintlc.dylib (compatibility version 1.0.0, current version 1.13.0)
    /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 62.0.0)

当我在插件上尝试otool -l 时,我确实看到了我在 Xcode 中插入的内容:

Load command 6
     cmd LC_UUID
 cmdsize 24
    uuid B61F2961-AD6D-30B9-AF58-C67689731966
Load command 7
      cmd LC_VERSION_MIN_MACOSX
  cmdsize 16
  version 10.7
      sdk 10.10
Load command 8
          cmd LC_LOAD_DYLIB
      cmdsize 88
         name /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 157.0.0
compatibility version 2.0.0
Load command 9
          cmd LC_LOAD_DYLIB
      cmdsize 40
         name libimf.dylib (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 0.0.0
compatibility version 0.0.0
Load command 10
          cmd LC_LOAD_DYLIB
      cmdsize 40
         name libsvml.dylib (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 0.0.0
compatibility version 0.0.0
Load command 11
          cmd LC_LOAD_DYLIB
      cmdsize 40
         name libirng.dylib (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 0.0.0
compatibility version 0.0.0
Load command 12
          cmd LC_LOAD_DYLIB
      cmdsize 40
         name libiomp5.dylib (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 5.0.0
compatibility version 5.0.0
Load command 13
          cmd LC_LOAD_DYLIB
      cmdsize 48
         name /usr/lib/libc++.1.dylib (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 120.0.0
compatibility version 1.0.0
Load command 14
          cmd LC_LOAD_DYLIB
      cmdsize 56
         name /usr/lib/libSystem.B.dylib (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 1213.0.0
compatibility version 1.0.0
Load command 15
          cmd LC_LOAD_DYLIB
      cmdsize 40
         name libintlc.dylib (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 1.13.0
compatibility version 1.0.0
Load command 16
          cmd LC_LOAD_DYLIB
      cmdsize 104
         name /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 62.0.0
compatibility version 1.0.0
Load command 17
          cmd LC_RPATH
      cmdsize 48
         path @executable_path/../Frameworks/ (offset 12)
Load command 18
      cmd LC_FUNCTION_STARTS
  cmdsize 16
  dataoff 3486976
 datasize 5616
Load command 19
      cmd LC_DATA_IN_CODE
  cmdsize 16
  dataoff 3492592
 datasize 0

如果我将Runpath Search Paths 设置为Intel Run Time Redistributable Libraries,我也会看到正确的路径,但结果是一样的。

谁能帮我解决这个问题?
我不是很有经验的开发者,所以一步一步来就好了。

【问题讨论】:

标签: xcode macos openmp dylib icc


【解决方案1】:

您的解决方案对于知道@rpath 的现代库是正确的。 OpenMP 库支持 @rpath 启动编译器版本 16.0 更新 2。在您的情况下,系统会忽略您的 RPATH 设置

您可以尝试与 photoshop 中的 openmp 库链接吗?据我了解,他们为此做了一个解决方法,并将 install_name 从 libiomp5.dylib 更新为“@executable_path/../Frameworks/libiomp5.dylib”。因此,如果您链​​接到该库,“otool -l”输出中的 openmp 名称将更改为 @executable_path/../Frameworks/libiomp5.dylib

一些提示

  1. 如果 Photoshop 通过 install_name_tool 更新安装名称

     $ otool -l ./a.out | grep omp
     name libiomp5.dylib (offset 24)
     # libiomp5.dylib was copied to the location with test 
     $ install_name_tool -id "@executable_path/../Frameworks/libiomp5.dylib" libiomp5.dylib
     $ LIBRARY_PATH=.:$LIBRARY_PATH icc -openmp test1.cpp 
     $ otool -l ./a.out | grep omp
     name @executable_path/../Frameworks/libiomp5.dylib (offset 24)
    
  2. RPATH 用法

    install_name_tool -id "@executable_path/../Frameworks/libiomp5.dylib" libiomp5.dylib
    $ LIBRARY_PATH=.:$LIBRARY_PATH icc -openmp test1.cpp -Wl,-rpath,.
    $ ./a.out
    dyld: Library not loaded: @executable_path/../Frameworks/libiomp5.dylib
      Referenced from: /nfs/inn/home/vpolin/mac/./a.out
      Reason: image not found
    Trace/BPT trap: 5
    $ install_name_tool -id "@rpath/libiomp5.dylib" libiomp5.dylib
    $ LIBRARY_PATH=.:$LIBRARY_PATH icc -openmp test1.cpp -Wl,-rpath,.
    $ otool -l ./a.out | grep omp
             name @rpath/libiomp5.dylib (offset 24)
    $ ./a.out
    4 8 8 8 8
    

--弗拉基米尔

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 2014-06-06
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2013-11-08
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多