You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将含本地头文件与库的Makefile转换为CMake的方法咨询

问题:如何在CMake中正确配置本地/include和/lib目录?

我不清楚如何将本地的/include和/lib目录添加到CMake文件中,查找解决方法时遇到了很多无法理解的实现方式。需要正确配置CMake来引入这两个目录,确保代码能正常使用其中的内容。

原Makefile代码:

OBJS = simple.o 
INCLUDES = -I../../include
LIBS = -L../../lib
LDFLAGS = -lglad -lglfw3 
PROGRAM = simple
CFLAGS = -g
COMPILER = g++

ifeq ($(OS),Windows_NT)     # is Windows_NT on XP, 2000, 7, Vista, 10...
    LDFLAGS += -lopengl32 -lgdi32
    PROGRAM :=$(addsuffix .exe,$(PROGRAM))
else ifeq ($(shell uname -s),Darwin)     # is MACOSX
    LDFLAGS += -framework Cocoa -framework OpenGL -framework IOKit
endif

simple: clean $(OBJS)
    $(COMPILER) -o $(PROGRAM) $(OBJS) $(LIBS) $(LDFLAGS)

simple.o: simple.c
    $(COMPILER) $(INCLUDES) $(CFLAGS) -c simple.c
    
RM = rm -f
ifeq ($(OS),Windows_NT)     # is Windows_NT on XP, 2000, 7, Vista, 10...
    RM := del
endif

clean: 
    $(RM) $(OBJS) $(PROGRAM)

当前写的CMake代码:

cmake_minimum_required(VERSION 3.23)
project(hw2)

set(CMAKE_CXX_STANDARD 17)

add_library(bar SHARED IMPORTED)

add_executable(hw2 main.cpp)

正确的CMake配置方式

下面是对应原Makefile功能的完整CMake配置,每一步对应Makefile里的逻辑:

  • 添加头文件搜索目录
    对应Makefile中的-I../../include,推荐使用目标级别的头文件目录(更符合CMake现代用法):

    target_include_directories(hw2 PRIVATE ../../include)
    

    PRIVATE表示这个头目录只给当前可执行文件用,不会传递给依赖它的其他目标。

  • 添加库文件搜索目录
    对应Makefile中的-L../../lib,同样用目标级别的配置:

    target_link_directories(hw2 PRIVATE ../../lib)
    
  • 链接所需库文件
    对应Makefile中的LDFLAGS,包括基础库和平台相关依赖:

    # 基础库:glad、glfw3
    target_link_libraries(hw2 PRIVATE glad glfw3)
    
    # 平台相关依赖
    if(WIN32)
        target_link_libraries(hw2 PRIVATE opengl32 gdi32)
    elseif(APPLE)
        target_link_libraries(hw2 PRIVATE "-framework Cocoa" "-framework OpenGL" "-framework IOKit")
    endif()
    
  • 设置编译选项
    对应Makefile中的CFLAGS = -g:

    target_compile_options(hw2 PRIVATE -g)
    
  • 其他说明

    • CMake会自动处理Windows平台下的.exe后缀,无需手动添加;
    • CMake默认提供clean目标,执行make clean(或cmake --build . --target clean)即可清理生成文件,无需自己编写;
    • 你之前写的add_library(bar SHARED IMPORTED)如果没有实际用到可以删除,这里不需要导入共享库,直接链接即可。

完整的CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
project(hw2)

set(CMAKE_CXX_STANDARD 17)

# 生成可执行文件
add_executable(hw2 main.cpp)

# 添加头文件目录
target_include_directories(hw2 PRIVATE ../../include)

# 添加库搜索目录
target_link_directories(hw2 PRIVATE ../../lib)

# 设置编译选项
target_compile_options(hw2 PRIVATE -g)

# 链接依赖库
target_link_libraries(hw2 PRIVATE glad glfw3)

# 平台相关链接配置
if(WIN32)
    target_link_libraries(hw2 PRIVATE opengl32 gdi32)
elseif(APPLE)
    target_link_libraries(hw2 PRIVATE "-framework Cocoa" "-framework OpenGL" "-framework IOKit")
endif()

内容的提问来源于stack exchange,提问作者Ovicior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:55:20