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

Setting DYLD_LIBRARY_PATH on Mac OS X Sierra (CoolProp)

免责声明:这个问题开始于 GitHub issue

问题

我会把 the X question 放在前面: 有谁知道 DYLD_LIBRARY_PATH 的设置方式 Excel 2016 会在 MacOS Sierra 上识别?

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

背景

我正在尝试为 Mac 获取 Excel 2016,以使用 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 之后,我能够使用测试电子表格检索“DYLDLIBRARYPATH”的内容。我还编辑了 startup.plist 并获得了类似的结果。我似乎遵循了所有正确的步骤,但似乎在我调用 setenv 时根本没有设置“DYLD_*”。如果我以 root 身份执行,结果是一样的。

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

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

due to SIP, one can no longer set any environment variable which starts with DYLD_

是也不是。 SIP 保护 Apple 二进制文件不受 DYLD_ 影响; 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监控,查看Excel进程的打开文件,可以清楚的看到libGMalloc.dylib被插入到其进程中

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