将含本地头文件与库的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)如果没有实际用到可以删除,这里不需要导入共享库,直接链接即可。
- CMake会自动处理Windows平台下的
完整的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
相关产品推荐
相关产品推荐

