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

免责声明:这个问题开始作为一个GitHub问题 。

我将把X的问题放在前面: 有没有人知道一种方法来设置DYLD_LIBRARY_PATH的方式,Excel 2016将在MacOS Sierra上识别?

实际问题(Y): CoolProp的开发人员可以如何在Excel中使用其dynamic库?

背景

我正在试图让Mac的Excel 2016识别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可以访问dynamic库并将libCoolProp.dylib文件复制到同一目录中的位置。 不幸的是,由于SIP,似乎不能再设置任何以DYLD_开头的环境variables。

为了validation这一点,我在单元格A1中构build了一个包含此VBA函数和=ENV("DYLD_LIBRARY_PATH")的testing电子表格。

 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 

在terminal中运行这个命令序列并重新启动Excel后,我可以使用testing电子表格检索“DYLDLIBRARYPATH”的内容。 我也编辑了startup.plist并获得了类似的结果。 我似乎遵循所有正确的步骤,但是当我调用setenv时,似乎并没有设置“DYLD_ *”。 如果我以root身份执行,结果是一样的。

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

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

由于SIP,我们不能再设置任何以DYLD_开头的环境variables

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

我们怎么知道呢?

有一个库libGMalloc.dylib可以用来监视应用程序的debugging分配。 从terminal执行以下操作: –

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

您将看到Excel已经启动并运行,虽然速度比平时稍慢,但是由于插入的库正在忙于监视所有内存分配的开销。

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

在这里输入图像说明

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