自 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
日志中的以下更改...
-isysroot
命令。
Mojave (>=10.14)可以使用-isysroot
命令。
来自gnu.org:
-isysroot <dir>
此选项类似于--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