十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【工具】使用cmake配置vs c++项目依赖库

【工具】使用cmake配置vs c++项目依赖库 目录前言cmake案例1只需要头文件的库案例2只需要链接的库案例3需要头文件链接的库案例4需要下载源码、本地编译然后头文件链接的依赖库案例5需要配置环境变量的附录配置OpenGL项目前言做点cmake的小尝试和笔记学习和熟悉cmake的用法。cmake案例1只需要头文件的库假设要依赖一个库 MathUtils它只提供了一些头文件比如一堆静态函数做数学运算它没有静态/动态库文件就只需要告诉编译器头文件的位置target_include_directories(MyTarget PRIVATE /path/to/MathUtils/include)按照我5年码龄的浅浅经验这种只需要依赖头文件的库一般是数学运算库或者是项目内部自己写的库。举例glmOpenGL math、stb_img加载图片。这种基于头文件实现的库Header-only library既不算静态库也不算动态库。从本质上来说它不是二进制库没有编译后的 .lib、.a 或 .so 文件。而是一个完全依赖预处理和编译的源代码形式的库。案例2只需要链接的库如果使用的是vs已经装好的库例如 OpenGL头文件已经在系统路径/usr/include中就只需要链接库target_link_libraries(MyTarget PRIVATE OpenGL::GL)案例3需要头文件链接的库如果头文件不在系统路径里就需要再加一行链接头文件的指令target_include_directories(glad PUBLIC ${THIRD_PARTY_DIR}/glad/include) target_link_libraries(${PROJECT_NAME} PRIVATE glad)案例4需要下载源码、本地编译然后头文件链接的依赖库include(FetchContent) FetchContent_Declare( glfw GIT_REPOSITORY https://github.com/glfw/glfw.git GIT_TAG 3.3.8 ) FetchContent_MakeAvailable(glfw) target_link_libraries(${PROJECT_NAME} PRIVATE glfw)我目前遇到的大多数开源仓库都是这样的。案例5需要配置环境变量的Autodesk的fbxset(FBX_SDK_ROOT E:/software/FBXSDK2020.3.7) target_include_directories(${PROJECT_NAME} PRIVATE ${FBX_SDK_ROOT}/include) target_link_libraries(${PROJECT_NAME} PRIVATE ${FBX_SDK_ROOT}/lib/x64/debug/libfbxsdk.lib)Qtset(QT_PREFIX_PATH D:/Softwares/Qt/5.15.2/msvc2019_64) include_directories(${QT_PREFIX_PATH}/include) target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets)Tipsinclude_directories用于全局地包含头文件。target_link_libraries用于指定项目去包含头文件适用于更复杂的项目cmake也是现代CMake中的推荐方式。附录配置OpenGL项目# 最低 CMake 版本要求 cmake_minimum_required(VERSION 3.10) # 项目名称和语言 project(Template LANGUAGES CXX) # 设置 C 标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(THIRD_PARTY_DIR ${CMAKE_SOURCE_DIR}/thirdparty) # 添加源文件 add_executable(${PROJECT_NAME} src/main.cpp) # 静态库 add_library(glad STATIC ${THIRD_PARTY_DIR}/glad/src/glad.c) # 自动下载外部库 include(FetchContent) FetchContent_Declare( glfw GIT_REPOSITORY https://github.com/glfw/glfw.git GIT_TAG 3.3.8 ) FetchContent_MakeAvailable(glfw) # 查找其它库 find_package(OpenGL REQUIRED) # 引用头文件 target_include_directories(glad PUBLIC ${THIRD_PARTY_DIR}/glad/include) target_include_directories(${PROJECT_NAME} PRIVATE ${THIRD_PARTY_DIR}/glm/include) target_include_directories(${PROJECT_NAME} PRIVATE ${THIRD_PARTY_DIR}/stb) # 链接库 target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL glfw glad) # 特殊用例FBX SDK set(FBX_SDK_ROOT E:/software/FBXSDK2020.3.7) target_include_directories(${PROJECT_NAME} PRIVATE ${FBX_SDK_ROOT}/include) target_link_libraries(${PROJECT_NAME} PRIVATE ${FBX_SDK_ROOT}/lib/x64/debug/libfbxsdk.lib)
返回列表