macOS Catalina 10.15下CMake编译失败求助
解决CMake编译时找不到
gmp.h的问题 从你的描述来看,CMake已经成功检测到GMP库,但编译阶段找不到头文件,而手动用cc main.c -lgmp能成功,问题出在你的CMakeLists.txt没有正确将GMP的头文件目录和库文件关联到你的目标上。以下是具体的修复步骤:
1. 修正CMakeLists.txt配置
你的现有配置中,find_package(GMP REQUIRED)已经找到了GMP,但没有把GMP的头文件路径添加到编译包含目录,同时target_link_libraries的写法也冗余且不规范。修改后的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) # 添加GMP的头文件目录到目标的包含路径 target_include_directories(Rozzeta PRIVATE ${GMP_INCLUDE_DIRS}) # 链接GMP库,使用find_package提供的变量即可 target_link_libraries(Rozzeta PRIVATE ${GMP_LIBRARIES})
如果你使用的是较新版本的GMP(支持CMake导入目标),还可以用更简洁的写法替换上面的include和link部分:
target_link_libraries(Rozzeta PRIVATE GMP::GMP)
这种写法会自动帮你处理头文件包含和库链接,更推荐使用。
2. 清理旧构建文件并重新构建
执行以下命令彻底清理之前的构建缓存,然后重新生成项目并编译:
rm -rf CMakeCache.txt CMakeFiles/ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=/usr/bin/clang -G "CodeBlocks - Unix Makefiles" /<path to project> cmake --build .
问题原因解释
- 手动编译
cc main.c -lgmp能成功,是因为系统默认会搜索/usr/local/include和/usr/local/lib目录,但CMake不会自动把这些路径加到你的目标配置里,必须显式通过target_include_directories指定头文件目录。 - 你原来的
target_link_libraries(Rozzeta gmp libgmp libgmp.a)写法冗余,而且没有关联到find_package找到的库路径,使用${GMP_LIBRARIES}或者导入目标GMP::GMP能确保链接到正确的库文件。
内容的提问来源于stack exchange,提问作者Gajaka




