在Mac OS X Sierra(CoolProp)上设置DYLD_LIBRARY_PATH

时间:2017-03-30 14:57:51

标签: excel macos dyld

免责声明:此问题始于GitHub issue

问题

我将the X question放在前面: 是否有人知道如何以Excel 2016在MacOS Sierra上识别的方式设置DYLD_LIBRARY_PATH

实际问题(Y): CoolProp的开发人员如何(其他)允许他们的动态库在Excel中使用?

背景

我正在尝试使用Excel 2016 for Mac来识别使用these instructions的CoolProp插件,这基本上归结为使用此startup.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>my.startup</string>
<key>ProgramArguments</key>
<array>
  <string>sh</string>
  <string>-c</string>
  <string>launchctl setenv DYLD_LIBRARY_PATH "/Users/$USER/Library/Group Containers/UBF8T346G9.Office"</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

DYLD_LIBRARY_PATH设置为Excel可以访问动态库并将libCoolProp.dylib文件复制到同一目录的位置。不幸的是,由于SIP,人们似乎无法再设置任何以DYLD_开头的环境变量。

为了验证这一点,我构建了一个测试电子表格,其中包含此VBA函数和单元格A1中的=ENV("DYLD_LIBRARY_PATH")

Public Function Env(Value As Variant) As String
    Env = Environ(Value)
End Function

我观察到这种行为:

$ launchctl setenv DYLD_LIBRARY_PATH "/Users/${USER}/Library/Group Containers/UBF8T346G9.Office"
$ launchctl getenv DYLD_LIBRARY_PATH  # empty output
$ launchctl setenv DYLDLIBRARYPATH "/Users/${USER}/Library/Group Containers/UBF8T346G9.Office" # Same kind of thing, but no underscores
$ launchctl getenv DYLDLIBRARYPATH # works fine
/Users/alchemyst/Library/Group Containers/UBF8T346G9.Office

在我的终端中运行这一系列命令并重新启动Excel之后,我能够检索&#34; DYLDLIBRARYPATH&#34;的内容。使用测试电子表格。我还编辑了startup.plist并获得了类似的结果。我似乎正在遵循所有正确的步骤,但似乎&#34; DYLD _ *&#34;当我打电话给setenv时根本没有设置。如果我以root身份执行,结果是一样的。

所以基本上我正在寻找任何方式,我仍然可以在Mac上使用这个插件。

版本:MacOS Sierra(10.12.3),Excel 2016(15.32),CoolProp 6.10

1 个答案:

答案 0 :(得分:4)

  

由于SIP,人们无法再设置任何以DYLD _

开头的环境变量

是和否。 SIP保护来自DYLD_ Apple 二进制文件; Microsoft的Excel不受SIP保护,DYLD_INSERT_LIBRARIES按预期工作。

我们怎么知道这个?

有一个库libGMalloc.dylib,可用于监视应用程序的调试分配。从终端执行以下操作: -

DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib /Applications/Microsoft\ Excel.app/Contents/MacOS/Microsoft\ Excel

您会看到Excel已启动并正常运行,但速度比平常慢一些,因为插入的库的开销会占用所有内存分配。

此外,使用Activity Monitor并查看Excel进程的打开文件,我们可以清楚地看到已插入其进程的libGMalloc.dylib。

enter image description here

我建议使用DYLD_INSERT_LIBRARIES代替DYLD_LIBRARY_PATH并从命令行引用Coolprop库,如此处所示。