自莫哈韦沙漠以来,链接在自制软件中无效

时间:2019-01-07 02:52:12

标签: c++ cmake homebrew

我现在已经在两台计算机上重现了这种症状,自升级计算机以来,cmake似乎不再出现在/usr/local/lib(或更恰当地说,$(brew --prefix)/lib)中,是由Homebrew提供的库到macOS Mojave。

尽管有一些方法可以避免这种情况(例如,使用EXECUTE_PROCESS搜索自制前缀;将结果添加到LINK_LIBRARIES(...)命令中),但都不是理想的选择。莫哈韦沙漠中发生了什么变化以打破这种行为?

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

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

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

cmakemake)显示的特定错误是:

ld: library not found for -l<somelib>

我有asked the question on the Homebrew forumsApple developer forums

2 个答案:

答案 0 :(得分:3)

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

  • 高塞拉山脉(<= 10.13)及以下地区不使用-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://stackoverflow.com/questions/54068035
    LINK_DIRECTORIES(/usr/local/lib)
ENDIF()

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

答案 1 :(得分:1)

尝试在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。这是命令序列。

第一

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