【问题标题】:Setting DYLD_LIBRARY_PATH on Mac OS X Sierra (CoolProp)在 Mac OS X Sierra (CoolProp) 上设置 DYLD_LIBRARY_PATH
【发布时间】:2017-03-30 14:57:51
【问题描述】:

免责声明:此问题以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 后,我可以使用测试电子表格检索“DYLDLIBRARYPATH”的内容。我还编辑了 startup.plist 并获得了类似的结果。我似乎遵循了所有正确的步骤,但是当我调用 setenv 时,似乎根本没有设置“DYLD_*”。如果我以 root 身份执行,结果是一样的。

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

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

【问题讨论】:

    标签: excel macos dyld


    【解决方案1】:

    由于 SIP,不能再设置任何以 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 Monitor,查看Excel进程打开的文件,我们可以清楚的看到已经插入到其进程中的libGMalloc.dylib。

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

    【讨论】:

    • 这很棒 - 它可以在 CLI 中运行!有什么方法可以做到这一点,只需要一次性干预吗?我认为使用这种方法会非常困难,因为您通常只想双击电子表格图标并打开 Excel 并加载正确的库。
    • 从进一步的测试看来,像这样在命令行上指定环境也适用于DYLD_LIBRARY_PATH。所以DYLD_INSERT_LIBRARIES 没有什么特别之处。我们又回到了如何在一般情况下执行此操作,而不仅仅是一次调用 Excel 的问题。至少我现在有了部分解决方案。
    • 如果您双击一个应用程序包,macOS 将启动通过Launch Services 注册的任何内容,并使用 plist 中指定的包的 URI;如果您有捆绑包的副本,这可能不是您单击的应用捆绑包!因此,启动服务妨碍了您,您需要设置它的环境,也许通过将调用 Excel 包装在另一个应用程序中。这超出了原始问题的范围。我建议一个新的,关于如何设置 LS 环境。
    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 2019-02-15
    • 2018-10-07
    • 2017-03-06
    • 2013-07-27
    • 2017-11-16
    • 2017-04-03
    相关资源
    最近更新 更多