热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cmake入门学习笔记

1概述cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目。CMa
1 概述

cmake 是kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目。

CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。
“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。

cmake的主要特点:
(1)开放源代码,使用类BSD 许可发布。http://cmake.org/HTML/Copyright.html
(2)跨平台,并可生成native 编译配置文件,在Linux/Unix 平台,生成 makefile,在苹果平台,可以生成xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
(3)能够管理大型项目,KDE4 就是最好的证明。
(4)简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
(5)高效虑,按照KDE 官方说法,CMake 构建KDE4 的 kdelibs 要比使用autotools 来构建KDE3.5.6 的 kdelibs 快40%,主要是因为 Cmake 在工具链中没有libtool。
(6)可扩展,可以为cmake 编写特定功能的模块,扩充cmake 功能。

2 安装cmake

2.1 卸载已经安装的旧版的CMake[非必需]

apt-get autoremove cmake

2.2 下载并解压cmake

wget https://cmake.org/files/v3.21/cmake-3.21.3-linux-x86_64.tar.gztar -xvf cmake-3.21.3-linux-x86_64.tar.gz

2.3 安装cmake

先将解压后的cmake放到/opt目录下

mv cmake-3.21.3-Linux-x86_64 /opt/cmake-3.21.3

2.4 创建软链接

sudo ln -sf /opt/cmake-3.21.3/bin/* /usr/bin/

3 CMake语法分析

CMake 最低版本号要求

cmake_minimum_required (VERSION 2.8)

CMake指定工程名

PROJECT(0VOICE)

手动加入文件 KaTeX parse error: Expected 'EOF', got '}' at position 6: {变量名}}̲ ,比如{SRC_LIST}

SET(SRC_LIST main.c)

生产执行文件名0voice 0voice2

ADD_EXECUTABLE(0voice ${SRC_LIST})

引用动态库

ADD_EXECUTABLE(darren ${SRC_LIST})

添加链接库。强制找静态库,完整的库文件名libDir1.a

#TARGET_LINK_LIBRARIES(darren libDir1.a)
#TARGET_LINK_LIBRARIES(darren lDir1)
target_link_libraries(multi-dir Dir1 Dir2)

添加子目录

ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/dir1")

设置子目录

set(SUB_DIR_LIST "${CMAKE_CURRENT_SOURCE_DIR}/dir1" "${CMAKE_CURRENT_SOURCE_DIR}/dir2")

安装doc到 share/doc/cmake/0voice目录,默认/usr/local/。指定自定义目录,比如 cmake -DCMAKE_INSTALL_PREFIX=/tmp/usr

# 将doc文件夹安装到/usr/local/share/doc/cmake/0voice
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)
# 将执行文件安装到bin目录
INSTALL(TARGETS darren RUNTIME DESTINATION bin)

编译过程中打印输出:

MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})

添加头文件路径

INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/dir1")

查找当前目录下的所有源文件,并将名称保存到 DIR_LIB_SRCS 变量

AUX_SOURCE_DIRECTORY(. DIR_SRCS)

添加库, 默认是静态库

#ADD_LIBRARY (dir1 SHARED ${DIR_SRCS})
ADD_LIBRARY (dir1 ${DIR_SRCS})

设置lib库目录

SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)

遍历源文件

foreach(SUB_DIR ${SUB_DIR_LIST})#遍历源文件aux_source_directory(${SUB_DIR} SRC_LIST)MESSAGE(STATUS "SUB_DIR-> " ${SUB_DIR})MESSAGE(STATUS "SRC_LIST-> " ${SRC_LIST})
endforeach()

设置Release版本还是Debug版本

# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")MESSAGE(STATUS "Release版本")SET(BuildType "Release")
else()SET(BuildType "Debug")MESSAGE(STATUS "Debug版本")
endif()

debug和release版本目录不一样,设置生成的so动态库最后输出的路径

#SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/${BuildType})

增加编译选项

ADD_COMPILE_OPTIONS(-fPIC)

默认生成静态库链接库Dir1

ADD_LIBRARY (Dir1 ${DIR_LIB_SRCS})

SHARED生成动态库

ADD_LIBRARY (Dir1 SHARED ${DIR_LIB_SRCS})

设置lib库目录

SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)

将库文件安装到lib目录

INSTALL(TARGETS Dir1 ARCHIVE DESTINATION lib)

将头文件include

INSTALL(FILES dir1.h DESTINATION include)
#INSTALL(FILES *.h DESTINATION include)

设置生成的so动态库最后输出的路径

SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)

设置bin和lib库目录, debug和release版本目录不一样

SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})

找在某个路径下的所有源文件

aux_source_directory(<dir> <variable>)

在这里插入图片描述

install: 配置程序打包过程中的目标&#xff08;TARGETS&#xff09;、文件&#xff08;FILES&#xff09;、路径&#xff08;DIRECTORY&#xff09;、代码
&#xff08;CODE&#xff09;和输出配置&#xff08;EXPORT&#xff09;

install(TARGETS ... [...])
install({FILES | PROGRAMS} ... [...])
install(DIRECTORY

... [...])
install(SCRIPT [...])
install(CODE [...])
install(EXPORT [...])

在这里插入图片描述

在这里插入图片描述

4 cmake使用举例

cmake执行方法&#xff1a;
1、在当前目录下执行 cmake .
2、创建build目录&#xff0c;进入build目录后再cmake ..

4.1 单个文件目录实现

在这里插入图片描述

main.c

#include int main(int argc, char *argv[])
{printf("0voice CMake!!!\n");return 0;
}

外层CMakeLists.txt

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
PROJECT(0VOICE)# 添加子目录
ADD_SUBDIRECTORY(src)#INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/0voice)
# 安装doc到 share/doc/cmake/0voice目录
# 默认/usr/local/
#指定自定义目录&#xff0c;比如 cmake -DCMAKE_INSTALL_PREFIX&#61;/tmp/usr ..
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)

src目录下CMakeLists.txt

# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
# PROJECT(0VOICE)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})ADD_EXECUTABLE(youzi ${SRC_LIST})
# 演示
ADD_EXECUTABLE(youzi2 ${SRC_LIST})
# 将执行文件安装到bin目录
# 默认/usr/local/
#指定自定义目录&#xff0c;比如 cmake -DCMAKE_INSTALL_PREFIX&#61;/tmp/usr ..
INSTALL(TARGETS youzi RUNTIME DESTINATION bin)
INSTALL(TARGETS youzi2 RUNTIME DESTINATION bin)

执行cmake
在这里插入图片描述

执行make
在这里插入图片描述
生成文件如下
在这里插入图片描述

4.2 多个目录实现-子目录编译成库文件

在这里插入图片描述
外层CMAkeLists.txt


# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
PROJECT(0VOICE)ADD_SUBDIRECTORY(src bin)#INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/0voice)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)

src目录下CMakeLists.txt

# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
PROJECT(0VOICE)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})# 添加头文件路径
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/dir1")
INCLUDE_DIRECTORIES(dir1)
MESSAGE(STATUS "CMAKE_CURRENT_SOURCE_DIR -> " ${CMAKE_CURRENT_SOURCE_DIR})
# 添加 dir1 子目录
ADD_SUBDIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/dir1")
# 添加头文件路径
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/dir2")
# 添加 dir2 子目录
ADD_SUBDIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/dir2")ADD_EXECUTABLE(darren ${SRC_LIST} )
TARGET_LINK_LIBRARIES(darren dir1 dir2)# 将执行文件安装到bin目录
INSTALL(TARGETS darren RUNTIME DESTINATION bin)

src/dir1目录下CMakeLists.txt

# 加载所有的源码&#xff0c;和makefile wildcard类似
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
# SET(DIR_SRCS dir1.c dir12.c)
# 默认是静态库
#ADD_LIBRARY (dir1 SHARED ${DIR_SRCS})
ADD_LIBRARY (dir1 ${DIR_SRCS})

src/dir2目录下CMakeLists.txt

AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_LIBRARY(dir2 ${DIR_SRCS})

执行顺序解析&#xff1a;当在最外层执行cmake .(或者build目录下执行cmake …)时&#xff0c;会先执行最外层的CMakeLists.txt文件的命令。遇到ADD_SUBDIRECTORY&#xff0c;会进入到src目录下继续执行子CMakeLists.txt。当执行到src目录下的MESSAGE指令时&#xff0c;会向控制台打印Binary和Source目录&#xff0c;然后接着在src目录下的CMakeLists.txt文件中往下执行。碰到INCLUDE_DIRECTORIES时将“${CMAKE_CURRENT_SOURCE_DIR}/dir1”目录加到头文件环境变量中&#xff0c;然后碰到ADD_SUBDIRECTORY&#xff0c;添加 dir1 子目录。dir2同理。再执行ADD_EXECUTABLE&#xff0c;表示依赖于 ${SRC_LIST}生成执行文件名darren。TARGET_LINK_LIBRARIES表示链接dir1动态库和dir2动态库。最后之星INSTALL将执行文件安装到bin目录。执行完后切换到最外层的CMakeLists.txt,执行INSTALL完成doc目录拷贝到share/doc/cmake/0voice的操作。

4.3 多个目录实现-子目录使用源码编译

在这里插入图片描述
最外层CMakeLists.txt


# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
PROJECT(0VOICE)ADD_SUBDIRECTORY(src bin)MESSAGE(STATUS "TOP CMAKE_CURRENT_SOURCE_DIR -> " ${CMAKE_CURRENT_SOURCE_DIR})#INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/0voice)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)

src目录下CMakeLists.txt

# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
# PROJECT(0VOICE)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})#设置子目录
set(SUB_DIR_LIST "${CMAKE_CURRENT_SOURCE_DIR}/dir1" "${CMAKE_CURRENT_SOURCE_DIR}/dir2")foreach(SUB_DIR ${SUB_DIR_LIST})#遍历源文件aux_source_directory(${SUB_DIR} SRC_LIST)MESSAGE(STATUS "SUB_DIR-> " ${SUB_DIR})MESSAGE(STATUS "SRC_LIST-> " ${SRC_LIST})
endforeach()# 添加头文件路径
INCLUDE_DIRECTORIES("dir1")
INCLUDE_DIRECTORIES("dir2")ADD_EXECUTABLE(darren ${SRC_LIST} )# 将执行文件安装到bin目录
INSTALL(TARGETS darren RUNTIME DESTINATION bin)

通过set(SUB_DIR_LIST "${CMAKE_CURRENT_SOURCE_DIR}/dir1" "${CMAKE_CURRENT_SOURCE_DIR}/dir2")将子目录dir1、dir2下的源文件添加到集合变量$SUB_DIR_LIST中&#xff0c;然后使用foreach遍历$SUB_DIR_LIST,通过aux_source_directory

4.4 生成库-生成动态库

命令行生成Debug版本&#xff1a;cmake -DCMAKE_INSTALL_PREFIX&#61;/tmp/usr …
命令行生成Release版本&#xff1a;cmake -DCMAKE_BUILD_TYPE&#61;Release …
在这里插入图片描述

cmake_minimum_required(VERSION 2.8s)
# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")MESSAGE(STATUS "Release版本")SET(BuildType "Release")
else()SET(BuildType "Debug")MESSAGE(STATUS "Debug版本")
endif()#设置lib库目录
SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
# debug和release版本目录不一样
#设置生成的so动态库最后输出的路径
#SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/${BuildType})
ADD_COMPILE_OPTIONS(-fPIC)# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)
# 默认生成静态库链接库Dir1
#ADD_LIBRARY (Dir1 ${DIR_LIB_SRCS})
# SHARED生成动态库
ADD_LIBRARY (Dir1 SHARED ${DIR_LIB_SRCS})

4.5 生成库-生成静态库&#43;安装到指定目录

在这里插入图片描述

cmake_minimum_required(VERSION 2.8s)
# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")MESSAGE(STATUS "Release版本")SET(BuildType "Release")
else()SET(BuildType "Debug")MESSAGE(STATUS "Debug版本")
endif()#设置lib库目录
SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
# debug和release版本目录不一样
#设置生成的so动态库最后输出的路径
#SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/${BuildType})
ADD_COMPILE_OPTIONS(-fPIC)# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)
# 默认生成静态库链接库Dir1
#ADD_LIBRARY (Dir1 ${DIR_LIB_SRCS})
# SHARED生成动态库
ADD_LIBRARY (Dir1 SHARED ${DIR_LIB_SRCS})

4.6 编译选项

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")message(STATUS "Release版本")set(BuildType "Release")SET(CMAKE_C_FLAGS "$ENV{CFLAGS} -DNODEBUG -O3 -Wall")SET(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -DNODEBUG -O3 -Wall")MESSAGE(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS})MESSAGE(STATUS "CFLAGS: " ${CMAKE_C_FLAGS})
else()# CMAKE_BUILD_TYPE 不带参数就是debug版本set(BuildType "Debug")message(STATUS "Debug版本")SET(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -Wall -O0 -gdwarf-3 -g -pg ")SET(CMAKE_C_FLAGS "$ENV{CFLAGS} -O0 -gdwarf-3 -g -pg")MESSAGE(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS})MESSAGE(STATUS "CFLAGS: " ${CMAKE_C_FILAGS})
endif()#设置生成的so动态库最后输出的路径
#设置bin和lib库目录
SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
#设置bin和lib库目录
# debug和release版本目录不一样
SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
add_compile_options(-fPIC)# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 添加头文件路径
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/dir1")
# 添加 dir1 子目录
add_subdirectory(dir1)
# 添加头文件路径
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/dir2")
# 添加 dir2 子目录
add_subdirectory(dir2)# 指定生成目标
add_executable(multi-dir main.c)
# 添加链接库
target_link_libraries(multi-dir Dir1 Dir2)
# 将执行文件安装到bin目录
INSTALL(TARGETS multi-dir RUNTIME DESTINATION bin)

4.7 设置执行目录&#43;编译debug和release版本

在这里插入图片描述
最外层CMakeLists.txt


# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
PROJECT(0VOICE)ADD_SUBDIRECTORY(src bin)
SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
#INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/0voice)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)

src目录下CMakeLists.txt

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")message(STATUS "Release版本")set(BuildType "Release")SET(CMAKE_C_FLAGS "$ENV{CFLAGS} -DNODEBUG -O3 -Wall")SET(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -DNODEBUG -O3 -Wall")MESSAGE(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS})MESSAGE(STATUS "CFLAGS: " ${CMAKE_C_FLAGS})
else()# CMAKE_BUILD_TYPE 不带参数就是debug版本set(BuildType "Debug")message(STATUS "Debug版本")SET(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -Wall -O0 -gdwarf-3 -g -pg ")SET(CMAKE_C_FLAGS "$ENV{CFLAGS} -O0 -gdwarf-3 -g -pg")MESSAGE(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS})MESSAGE(STATUS "CFLAGS: " ${CMAKE_C_FILAGS})
endif()#设置生成的so动态库最后输出的路径
#设置bin和lib库目录
SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
#设置bin和lib库目录
# debug和release版本目录不一样
SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
add_compile_options(-fPIC)# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 添加头文件路径
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/dir1")
# 添加 dir1 子目录
add_subdirectory(dir1)
# 添加头文件路径
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/dir2")
# 添加 dir2 子目录
add_subdirectory(dir2)# 指定生成目标
add_executable(multi-dir main.c)
# 添加链接库
target_link_libraries(multi-dir Dir1 Dir2)
# 将执行文件安装到bin目录
INSTALL(TARGETS multi-dir RUNTIME DESTINATION bin)

src/dir1目录下CMakeLists.txt

# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")message(STATUS "Release版本")set(BuildType "Release")
else()set(BuildType "Debug")message(STATUS "Debug版本")
#SET(CMAKE_C_FILAGS "-O0 -g")
endif()#设置lib库目录
set(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
# debug和release版本目录不一样
#设置生成的so动态库最后输出的路径
SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
add_compile_options(-fPIC)# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库Dir1
#add_library (Dir1 ${DIR_LIB_SRCS})
# 生成动态库
add_library (Dir1 SHARED ${DIR_LIB_SRCS})
# 将库文件安装到lib目录
INSTALL(TARGETS Dir1 DESTINATION lib)
# 将头文件include
INSTALL(FILES dir1.h DESTINATION include)

src/dir2目录下CMakeLists.txt

# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")message(STATUS "Release版本")set(BuildType "Release")MESSAGE(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS})MESSAGE(STATUS "CFLAGS: " ${CMAKE_C_FLAGS})
else()set(BuildType "Debug")message(STATUS "Debug版本")MESSAGE(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS})MESSAGE(STATUS "CFLAGS: " ${CMAKE_C_FLAGS})
endif()#设置lib库目录
set(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
# debug和release版本目录不一样
#设置生成的so动态库最后输出的路径
SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
add_compile_options(-fPIC)# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库Dir2
#add_library (libDir2.a STATIC ${DIR_LIB_SRCS})
# 生成动态库
add_library (Dir2 SHARED ${DIR_LIB_SRCS})
# 将库文件安装到lib目录
INSTALL(TARGETS Dir2 DESTINATION lib)
# 将头文件include
INSTALL(FILES dir2.h DESTINATION include)

推荐一个零声学院免费公开课程&#xff0c;个人觉得老师讲得不错&#xff0c;分享给大家&#xff1a;Linux&#xff0c;Nginx&#xff0c;ZeroMQ&#xff0c;MySQL&#xff0c;Redis&#xff0c;fastdfs&#xff0c;MongoDB&#xff0c;ZK&#xff0c;流媒体&#xff0c;CDN&#xff0c;P2P&#xff0c;K8S&#xff0c;Docker&#xff0c;TCP/IP&#xff0c;协程&#xff0c;DPDK等技术内容&#xff0c;点击立即学习:


推荐阅读
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • C盘无法格式化的原因及解决方法
    本文探讨了C盘无法格式化的原因,并提供了详细的解决方案,帮助用户顺利进行系统维护。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
author-avatar
Rianbow_小渊渊设
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有