自 Mojave 以来,链接在 homebrew 的 cmake 中不起作用

Posted

技术标签:

【中文标题】自 Mojave 以来,链接在 homebrew 的 cmake 中不起作用【英文标题】:Linking not working in homebrew's cmake since Mojave 【发布时间】:2019-06-01 17:49:46 【问题描述】:

我现在已经在两台计算机上重现了这种症状,自从将我的计算机升级到 macOS Mojave 后,cmake 似乎不再在 /usr/local/lib(或更准确地说,$(brew --prefix)/lib)中查找 Homebrew 提供的库。

虽然有一些方法可以规避这一点(例如,使用 EXECUTE_PROCESS 搜索自制前缀;将结果添加到 LINK_LIBRARIES(...) 命令)没有一个是理想的。 Mojave 发生了什么改变来打破这种行为?

临时解决方法是将以下内容添加到CMakeLists.txt

# WARNING: Don't hard-code this path
LINK_DIRECTORIES(/usr/local/lib)

我已经尝试过brew doctor 并更新了所有自制软件包,但无济于事。

cmake (make) 显示的具体错误是:

ld: library not found for -l<somelib>

我有asked the question on the Homebrew forums 和Apple developer forums。

【问题讨论】:

我发现this article 解释了如何使用ld -v 2 列出链接器搜索路径。在 High Sierra 上,它在默认链接器路径中列出 /usr/local/lib。需要与 Mojave 进行比较。 ...更新,Mojave 在默认链接器路径中也有/usr/local/lib 只有在将 VERBOSE=1 添加到 make 并比较 10.13 和 10.14 之间的确切链接器标志之后,我才能将其追踪到添加的新 -isysroot 标志。这是 MacPorts 上的详细讨论trac.macports.org/ticket/57612 【参考方案1】:

我已将此隔离为 VERBOSE=1 make 日志中的以下更改...

High Sierra (不使用-isysroot 命令。 Mojave (>=10.14)可以使用-isysroot 命令。

来自gnu.org:

-isysroot &lt;dir&gt; 此选项类似于--sysroot 选项,但仅适用于头文件(Darwin 目标除外,它适用于头文件和库)。有关详细信息,请参阅--sysroot 选项。

所以这个标志专门破坏了 Apple 上的 lib 搜索路径。这导致编译永远不会查看标准的ld 位置,可以通过键入ld -v dummy 来查看。

Library search paths:
    /usr/lib
    /usr/local/lib

cmake 为什么要这样做?我的想法是修复新 Mojave SDK 行为引入的 /usr/local/include issues。

不幸的是,我找不到 cmake 编译标志来重新添加默认库搜索路径。目前我找到的唯一解决方案是将以下内容添加到我的项目中:

IF(APPLE)
    # Fix linking on 10.14+. See https://***.com/questions/54068035
    LINK_DIRECTORIES(/usr/local/lib)
ENDIF()

我不确定这是否是需要上游 cmake 补丁的行为。如果有更好的解决方案,请提供。

【讨论】:

谢谢你,这是安装wireshark的问题。我在哪里添加代码? 如果你是从源代码构建的,我猜CMakeLists.txt,但我不熟悉代码库。如果您是从 MacPorts 或 Homebrew 之类的软件安装,它可能需要进入补丁文件,或者作为提交给 Wireshark 代码审查流程。 code.wireshark.org/review/#/q/status:open。 Wireshark 非常受欢迎,因此它可能值得在这里或 Wireshark 错误跟踪器上提出专门的问题。【参考方案2】:

在 OS X Mojave (10.14) 下的 Django 应用程序中尝试 pip install psycopg2 时遇到相关 (?) 问题。我收到以下错误:

ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'clang' failed with exit status 1

简短的解释:« 自 High Sierra 起,/usr/local 不再是 可以... »

解决方案:change permissions for /usr/local to allow Homebrew to create links。

我根据自己的需要调整了解决方案。然后我终于可以运行pip install psycopg2。以下是命令序列(update:在您的项目根目录中,即您看到 manage.py 的位置)。

第一

sudo chown -R $(whoami) $(brew --prefix)/*

然后

brew reinstall openssl
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
pip install psycopg2

【讨论】:

设置 LDFLAGS 和 CPPFLAGS 似乎已经解决了这个问题而无需 chowning /usr/local Mojave 10.14.6 谢谢!我有这个完全相同的问题。这让我发疯了。

以上是关于自 Mojave 以来,链接在 homebrew 的 cmake 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 CLion 中设置 OpenMP 项目 MacOS Mojave

在 MacOS Mojave 上为 QGIS 安装 Python 3.6

macOS(Mojave10.14.1)安装MongoDB 4.0.3

M1 macOS Mojave 全局 bin 文件夹权限错误上的 npm

Mac OS安装Homebrew 以及‘Permission denied’问题解决

Homebrew:无法符号链接,/usr/local/bin 不可写[关闭]