cmake在MacOS Catalina 10.15上构建失败

7

我最近安装了macOS Catalina操作系统,同时也更新了CMake、Clang和LLVM等工具,并搭配Xcode 11.1使用。

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 无关。 - trojanfoe
非常感谢您的回答。我已经添加了target_include_directories,但现在我又遇到了另一个问题:[50%]正在构建C对象CMakeFiles / Rozzeta.dir / main.c.o [100%]链接C可执行文件Rozzeta ld:找不到库-lgmp clang:错误:链接器命令失败,退出代码1(使用-v查看调用)我添加的代码是:set(INCLUDE_DIRS /usr/local/include/ /usr/local/lib/)target_include_directories(Rozzeta PUBLIC $ {INCLUDE_DIRS})。也许我缺少一些基本的东西-我是clang的新手。 - Gajaka
/usr/local/lib/ 不是一个包含目录,而是一个链接器目录,因此请将其放入 target_link_directories(Rozetta ...) 中。然而,这使得使用 find_package(GMP REQUIRED) 没有意义,所以您可以将其删除。 - trojanfoe
感谢您再次帮助我。然而,我仍然遇到同样的错误:ld: 找不到库文件 -lgmp clang: 错误: 链接器命令失败,退出代码为1(使用-v查看调用) - Gajaka
那个系统根目录看起来不对。你可以完全省略它,或者指定真实的系统根目录,你可以从 xcrun 获取。 - trojanfoe
显示剩余3条评论
4个回答

5
我非常沮丧!我个人正在使用jetbrains的CLion,并尝试构建旧的C/C++代码时,因为MacOS 10.15 Catalina删除了原来在Mojave中用作C头文件包的内容,所以出现了错误。 因此,我找到了另一种解决方法并尝试了一下。
如果您安装了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 - Gajaka
谢谢,xcode-select --install 在我升级到Catalina后解决了我的CLion cmake/build问题。 - 101
10
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/下的所有内容批量软链接到/usr/local/include/是一个不好的想法。这样做会破坏许多使用不同库进行编译的程序包。@Roy,你至少应该添加一份免责声明。 - tmo
请不要这样做(批量符号链接到 /usr/local)... 这将会造成巨大的混乱。 - melMass

0
如果您在CMake文件中调用find_package(GMP ...),为什么不使用它填充的GMP特定变量呢?根据您的CMake日志,看起来CMake成功找到了安装在您系统上的GMP,因此请尝试使用应该被填充的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})

-1

之后

xcode-select --install

我有一个 clang 但没有 cmake,所以我这样做了

brew install cmake

安装Catalina的cmake。


-1
为了在 Mac OS 10.15 (Catalina) 上使用 cmake 和 XCode 工具链编译程序,你必须安装 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

1
已经在@Roy的回答中评论过了,创建所有这些符号链接并不是一个好主意,因为它会破坏其他几个软件包... - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接