免责声明:此问题始于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
答案 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。
我建议使用DYLD_INSERT_LIBRARIES
代替DYLD_LIBRARY_PATH
并从命令行引用Coolprop库,如此处所示。