【问题标题】:cmake build failed on macos catalina 10.15cmake 在 macos catalina 10.15 上构建失败
【发布时间】:2020-02-06 13:40:33
【问题描述】:

我最近用 Xcode 11.1 安装了 macos catalina 并更新了 cmake、clang 和 llvm

sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install

$ cmake --version
cmake version 3.15.4

$ which cmake
/usr/local/bin/cmake

$ clang --version
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ which clang
/usr/bin/clang

CMakeLists.txt 如下所示:

cmake_minimum_required(VERSION 3.14)

project("ROZZETA" VERSION 0.0.1 LANGUAGES C)

# Allow us to import cmake scripts from  ./cmake
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}")
# Compiler flags
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")

find_package(GMP REQUIRED)
add_executable(Rozzeta main.c)
target_link_libraries(Rozzeta gmp libgmp libgmp.a)

cmake 检测到 gmp 成功:

/usr/local/bin/cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=c++ -G "CodeBlocks - Unix Makefiles" /<path to project>
-- The C compiler identification is AppleClang 11.0.0.11000033
-- Check for working C compiler: /usr/bin/clang
-- Check for working C compiler: /usr/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Using toolchain file: .
-- Found GMP: /usr/local/include/gmp.h and /usr/local/lib/libgmp.a
-- Configuring done
-- Generating done

构建失败:

cmake --build  .
Scanning dependencies of target Rozzeta
[ 50%] Building C object CMakeFiles/Rozzeta.dir/main.c.o
/Users/gajaka/CLionProjects/Rozzeta/main.c:4:10: fatal error: 'gmp.h' file not found
#include <gmp.h>
         ^~~~~~~
1 error generated.
make[2]: *** [CMakeFiles/Rozzeta.dir/main.c.o] Error 1
make[1]: *** [CMakeFiles/Rozzeta.dir/all] Error 2
make: *** [all] Error 2

我已经手动编译了:

cc main.c -lgmp

任何人都可以帮助我吗? 非常感谢提前

【问题讨论】:

  • 我可以看到target_link_libraries(Rozzeta ...),但我没有看到任何我预期的target_include_directories(Rozetta ...)。所以我认为这是一个损坏的CMakeLists.txt 文件,与 macOS/Xcode/clang 无关。
  • 非常感谢您的回答。我添加了target_include_directories,现在我有另一个问题[ 50%] Building C object CMakeFiles/Rozzeta.dir/main.c.o [100%] Linking C executable Rozzeta ld: library not found for -lgmp clang: error: linker command failed with exit code 1 (use -v to see invocation) 我添加的代码是:set(INCLUDE_DIRS /usr/local/include/ /usr/local/lib/)target_include_directories(Rozzeta PUBLIC ${INCLUDE_DIRS})。也许我缺少一些基本的东西 - 我是 clang 的新手。
  • /usr/local/lib/ 不是包含目录,而是链接器目录,因此请将其放入target_link_directories(Rozetta ...)。但是,这使得 find_package(GMP REQUIRED) 的使用毫无意义,因此您不妨删除它。
  • 再次感谢您帮助我。但是,我遇到了同样的错误:ld: library not found for -lgmp clang: error: linker command failed with exit code 1 (use -v to see invocation)
  • 我找到了问题的根源。在link.txt 文件中,我删除了-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk,构建成功通过。知道需要做什么才能使 link.txt 文件不被修改吗?

标签: macos cmake clang gmp


【解决方案1】:

这让我非常沮丧!我个人使用 jetbrains 的 CLion,在尝试构建用 C/C++ 编写的旧代码时,它给了我错误,因为 MacOS 10.15,Catalina 删除了曾经在 Mojave 中的 C 头文件 pkg。所以,找到了另一种方法并尝试了。

如果你已经安装了 XCode 11.1,那么打开终端并运行以下命令:

xcode-select --install

那么,

sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

现在,你可以走了。尝试使用 cmake 构建。

【讨论】:

  • 是的,我也在使用 CLion。你的修复对我不起作用。我前几天试过。非常感谢您的回答。我对目前的临时修复感到满意。是的,根本没有macOS_SDK_headers_for_macOS_10.XX.pkg
  • 谢谢,xcode-select --install 在升级到 Catalina 后修复了我的 CLion cmake/build 问题。
  • 将所有内容从/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/ 链接到/usr/local/include/ 是个坏主意。这将破坏与一系列库一起编译的几个包。 @Roy,您至少应该添加免责声明。
  • 请永远不要这样做(批量符号链接到 /usr/local)...你会造成巨大的混乱
【解决方案2】:

如果您在 CMake 文件中调用 find_package(GMP ...),为什么不使用它填充的 GMP 特定变量?看起来 CMake 成功地找到了安装在您的系统上的 GMP(基于您的 CMake 日志),因此请尝试使用应该填充的 GMP_* 变量:

cmake_minimum_required(VERSION 3.14)

project("ROZZETA" VERSION 0.0.1 LANGUAGES C)

# Allow us to import cmake scripts from  ./cmake
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}")
# Compiler flags
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")

find_package(GMP REQUIRED)
add_executable(Rozzeta main.c)

# Use the populated GMP variables here.
target_include_directories(Rozzeta PRIVATE ${GMP_INCLUDE_DIR})
target_link_libraries(Rozzeta PRIVATE ${GMP_LIB})

【讨论】:

    【解决方案3】:

    之后

    xcode-select --install
    

    我得到了clang,但没有cmake,所以我做到了

    brew install cmake
    

    为 Catalina 安装了 cmake。

    【讨论】:

      【解决方案4】:

      要在 Mac OS 10.15 (Catalina) 中使用 cmakeXCode 的 工具链编译程序,您必须安装 xcode 命令行实用工具 + 制作一些额外的符号链接(@Roy 说过,但忘了提及其他两个):

      $ xcode-select --install
      $ sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/
      $ for i in {Platforms,Toolchains,Tools}; do sudo ln -sn /Applications/Xcode.app/Contents/Developer/$i /Library/Developer/CommandLineTools/$i; done
      

      【讨论】:

      • 已经在@Roy 上评论说创建所有这些符号链接不是一个好主意,因为它破坏了其他几个包......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 2021-08-13
      • 2020-02-02
      • 1970-01-01
      • 2020-09-02
      相关资源
      最近更新 更多