CMake配置报错:目标未构建及头文件、dylib路径配置问题
CMake配置问题解答
错误根源
你碰到的错误是因为**target_include_directories必须在add_executable之后调用**——CMake要求先创建目标(比如可执行文件),才能给它设置包含目录、链接库这类属性。
问题1:同时指定系统头文件与项目内头文件的CMake关键字
核心用target_include_directories,但要注意调用顺序,同时可以结合CMake内置变量提升灵活性:
- 系统级头文件(比如Homebrew安装的
/usr/local/include)可以加SYSTEM标记,告诉CMake这是系统目录,避免不必要的编译警告 - 项目内头文件用
PROJECT_SOURCE_DIR(CMake内置变量,代表CMakeLists.txt所在的项目根目录)代替硬编码绝对路径,让配置更通用
示例写法:
# 先创建可执行目标 add_executable(glgame ${SOURCES}) # 再设置包含目录 target_include_directories(glgame PRIVATE SYSTEM /usr/local/include # Homebrew系统头文件目录 ${PROJECT_SOURCE_DIR}/include # 项目内头文件目录 )
问题2:让CMake指向系统dylib文件夹
CMake不能直接链接整个目录,需要分两步处理:
- 指定库文件所在目录:用
target_link_directories,必须放在add_executable之后:
target_link_directories(glgame PRIVATE /usr/local/lib)
- 明确链接具体库:
target_link_libraries需要指定具体的库名,而不是文件夹,比如:
target_link_libraries(glgame PRIVATE glfw OpenGL::GL)
更优雅的方式:用find_package
Homebrew安装的多数库会自带CMake配置文件,用find_package能自动处理头文件和库路径,不用手动写硬编码路径:
find_package(glfw3 REQUIRED) find_package(OpenGL REQUIRED) # 直接链接找到的目标库 target_link_libraries(glgame PRIVATE glfw OpenGL::GL)
完整修正后的CMakeLists.txt
cmake_minimum_required(VERSION 3.19) project(glgame LANGUAGES CXX) # 源文件只放cpp/c文件,头文件不用加进来 set(SOURCES src/glad.c src/imgui_demo.cpp src/imgui_draw.cpp src/imgui_impl_glfw.cpp src/imgui_impl_opengl3.cpp src/imgui_tables.cpp src/imgui_widgets.cpp src/imgui.cpp src/main.cpp ) # 先创建可执行目标 add_executable(glgame ${SOURCES}) # 指定C++标准(可选,建议添加) target_compile_features(glgame PRIVATE cxx_std_17) # 设置包含目录 target_include_directories(glgame PRIVATE SYSTEM /usr/local/include ${PROJECT_SOURCE_DIR}/include ) # 指定库目录(如果需要手动指定的话) target_link_directories(glgame PRIVATE /usr/local/lib) # 链接具体依赖库 target_link_libraries(glgame PRIVATE glfw OpenGL::GL)
注意:原配置里把头文件用include()语法塞进SOURCES是错误的——头文件不需要加到源文件列表,只要通过target_include_directories指定了包含目录,编译时CMake会自动找到它们。
内容的提问来源于stack exchange,提问作者BeardlessDev
相关产品推荐
相关产品推荐

