ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 静态库、动态库使用Cmake构建系统

2022-08-24 18:00:58  阅读:190  来源: 互联网

标签:src include Cmake 静态 C++ ++ cpp main data


案例1:无静态库、动态库参与

文件目录结构1


假设include目录存放头文件data.h包含函数声明,src目录存放对应的data.cpp文件包含函数定义、以及一个全局变量。main.cpp存放在文件根目录、包含main函数入口。

代码内容

常规编译指令

g++ main.cpp src/data.cpp -Iinclude -o main

Cmake构建

新建CMakeList.txt文件,填写以下4行内容:

cmake_minimum_required(VERSION 3.5)
project (hello_cmake1)
include_directories(include/)		# 与g++ 命令的 -Iinclude 参数等价
add_executable(main main.cpp src/data.cpp)	# g++ main.cpp src/data.cpp -o main

效果:

案例2:静态链接库参与

原来三个文件的代码不变。
首先看常规的基于g++ 编译生成静态链接库的命令:

cd src	
g++ data.cpp -c -I../include	# 汇编,生成data.o文件
ar rs libdata.a data.o			# 生成静态库 libdata.a
cd ..
g++ main.cpp -Iinclude -Lsrc -ldata -o static_main	# 链接,生成可执行文件static_main

Cmake构建

新建CMakeList.txt文件,填写以下内容:

cmake_minimum_required(VERSION 3.5)
project (hello_cmake2)

# 生成静态链接库
add_library(Data STATIC src/data.cpp)
target_include_directories(Data PUBLIC ${PROJECT_SOURCE_DIR}/include)

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

# 链接静态/共享 库文件
target_link_libraries(static_main PUBLIC Data)

效果:

案例3:动态链接库参与

原来三个文件的代码不变。
首先看常规的基于g++ 编译生成动态链接库的命令:

cd src
g++ data.cpp -I../include -fPIC -shared -o libdata.so
# 上一条等价于下面两条: 
#      g ++ data.cpp -I../include -c -fPIC		汇编,生成data.o文件
#	g++ -shared -o libdata.so data.o		生成动态库 libdata.so		
cd ..
g++ main.cpp -Iinclude -Lsrc -ldata -o share_main	 # 链接,生成可执行文件static_main

Cmake构建

cmake_minimum_required(VERSION 3.5)
project (hello_cmake3)

# 生成动态链接库
add_library(Data2 SHARED src/data.cpp)
target_include_directories(Data2 PUBLIC ${PROJECT_SOURCE_DIR}/include)

# 添加编译参数
add_compile_options(-w -std=c++11 -O2)

# 生成可执行文件
add_executable(share_main main.cpp)
# 链接静态/共享 库文件
target_link_libraries(share_main PUBLIC Data2)

效果:

标签:src,include,Cmake,静态,C++,++,cpp,main,data
来源: https://www.cnblogs.com/Higgerw/p/16621093.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有