PT0092_Linux下C++开发(四)-----计算机学习实战课件

PPT
  • 阅读 58 次
  • 下载 0 次
  • 页数 15 页
  • 大小 198.726 KB
  • 2022-12-01 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档10.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
PT0092_Linux下C++开发(四)-----计算机学习实战课件
可在后台配置第一页与第二页中间广告代码
PT0092_Linux下C++开发(四)-----计算机学习实战课件
可在后台配置第二页与第三页中间广告代码
PT0092_Linux下C++开发(四)-----计算机学习实战课件
可在后台配置第三页与第四页中间广告代码
PT0092_Linux下C++开发(四)-----计算机学习实战课件
PT0092_Linux下C++开发(四)-----计算机学习实战课件
还剩5页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 15
  • 收藏
  • 违规举报
  • © 版权认领
下载文档10.00 元 加入VIP免费下载
文本内容

【文档说明】PT0092_Linux下C++开发(四)-----计算机学习实战课件.pptx,共(15)页,198.726 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-77171.html

以下为本文档部分文字说明:

Linux下C++开发(四)动、静态库与安装操作本系列Linux下的C++开发,主要分为两大部分,第一部分讲解Linux下C++的开发流程及一些基础知识,第二部分讲解Cmake的使用,初步计划如下:1,Linux下C++的开

发流程及基础知识介绍2,cmake简述及CMakeLists基本语句语法3,多目录工程4,动,静态库及安装操作5,模块的使用及自定义模块6,Linux下各种IDE介绍和对比今天主要给大家介绍的就是第二部分的第三节:动、静态库及安装操作安装操作这

里讲到的安装操作类似一种自动化的复制我们首先看一下本次项目的结构将工程项目中的各种类型的文件安装到指定的目录中去将cmake/3/COPYRIGHT安装到cmake/install_dir/doc将c

make/3/README安装到cmake/install_dir/doc将cmake/3/doc/hello.txt安装到cmake/install_dir/doc将cmake/3/runhello.sh安装到cmake/install_dir/bin将输出的二进制文件

也安装到cmake/install_dir/bin安装操作接下来看如何在CMakeLists.txt中具体实现这些步骤cmake_minimum_required(VERSION2.6)PROJECT(demo3)MESSAGE(STATUS"T

hisisBINARYdir"${demo3_BINARY_DIR})MESSAGE(STATUS"ThisisSOURCEdir"${demo3_SOURCE_DIR})#addexecutablefileADD_SUBDIRECTORY(./src)#setCMAKE_INSTALL_PRE

FIXSET(CMAKE_INSTALL_PREFIX/home/liqi/workspace/cmake/install_dir)MESSAGE(STATUS"CMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX})#in

stallsomefilesINSTALL(PROGRAMSrunhello.shDESTINATIONbin)INSTALL(DIRECTORYdoc/DESTINATIONdoc)INSTALL(FILESCOPYRIGHTREADMEDESTINATIONdoc)

主目录的CMakeLists.txtADD_EXECUTABLE(hellohello.c)#setoutputpathSET(EXECUTABLE_OUTPUT_PATH"${CMAKE_BINARY_

DIR}/bin")#MESSAGE(${EXECUTABLE_OUTPUT_PATH})INSTALL(TARGETShelloRUNTIMEDESTINATIONbin)src目录下的CMakeLists.txt安装操作CMAKE_INSTALL_P

REFIX变量CMAKE_INSTALL_PREFIX变量类似于configure–脚本的prefix常见的使用方法看起来是这个样子:cmake-DCMAKE_INSTALL_PREFIX=/usr.如果没有额外定义,那么CMAKE_INSTALL_PREFIX变量

默认为/usr/localDESTINATION定义了安装的路径如果路径以/开头,那么指的是绝对路径,这时候CMAKE_INSTALL_PREFIX其实就无效了如果你希望使用CMAKE_INSTALL_PREFIX来定义安装路径,就要写成

相对路径,即不要以/开头那么安装后的路径就是${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>安装操作INSTALL(TARGETStargets...[[ARCHIVE|LIBRARY|RUNTIME][DESTINATION<dir>][PER

MISSIONSpermissions...][CONFIGURATIONS[Debug|Release|...]][COMPONENT<component>][OPTIONAL]][...])参数中的TARGETS后面跟的就是我们通过ADD_EXECUTABLE

或者ADD_LIBRARY定义的目标文件,可能是静态库、动态库、可执行二进制INSTALL(FILESfiles...DESTINATION<dir>[PERMISSIONpermissions...][CONF

IGURATIONS[Debug|Release|...]][COMPONENT<component>][RENAME<name>][OPTIONAL])可用于安装一般文件,并可以指定访问权限,文件名是此指令所在路安装操作INSTALL(PROGRAM

Sfiles...DESTINATION<dir>[PERMISSIONSpermissions...][CONFIGURATIONS[Debug|Release|...]][COMPONENT<component>][RENAME<name>][OPTIONAL])非目标文件的可执行程

序安装(比如脚本之类)安装后权限为:OWNER_EXECUTE,GROUP_EXECUTE,和WORLD_EXECUTE,即755权限INSTALL(DIRECTORYdirs...DESTINATION<dir>[FIL

E_PERMISSIONSpermissions...][DIRECTORY_PERMISSIONSpermissions...][USE_SOURCE_PERMISSIONS][CONFIGURATIONS[Debug|Release|...]][COMPONENT<com

ponent>][[PATTERN<pattern>|REGEX<regex>][EXCLUDE][PERMISSIONSpermissions...]][...])PATTERN用于使用表达式进行过滤PERMISSIONS用于指定PATTERN

过滤后的文件权限。INSTALL([[SCRIPT<file>][CODE<code>]][...])SCRIPT参数用于在安装时调用cmake脚本文件(也就是<abc>.cmake文件)CODE参数用于执行CMAKE指令,必须以双引号括

起来。比如:INSTALL(CODE"MESSAGE(\"Sampleinstallmessage.\")"动、静态库动态库:动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在静态库:

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库本次示例工程文件结构如左图所示hello.c与hello.h将被用来生成动态库和静态库并且将生成的库文件放到下面lib文件夹中#cmakeversioncmake_minimum_required(VERSION2.8.3)

#projectnamePROJECT(demo4)#addsubdirectoryADD_SUBDIRECTORY(library)#setprefixSET(CMAKE_INSTALL_PREFIX/home/liqi/workspace/cmake/

install_dir)MESSAGE(STATUS"CMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX})主目录下的CMakeLists.txt#setsourcevariableSET(LIBHELLO_SRCh

ello.c)#addexecutable#ADD_EXECUTABLE(demo4hello.hhello.c)#setoutputpathSET(LIBRARY_OUTPUT_PATH${PROJECT_BINARY_DIR}

/lib)#SET(EXECUTABLE_OUTPUT_PATH${PROJECT_BINARY_DIR}/bin)#addlibraryADD_LIBRARY(helloSHARED${LIBHELLO_SRC})ADD_LIBRARY(hello_staticSTATIC${LIBHEL

LO_SRC})#changestaticlibrarypropertySET_TARGET_PROPERTIES(hello_staticPROPERTIESOUTPUT_NAME"hello")#changeCLEAN_DIRECT_OUPUTpropertiesSET_T

ARGET_PROPERTIES(helloPROPERTIESCLEAN_DIRECT_OUTPUT1)SET_TARGET_PROPERTIES(hello_staticPROPERTIESCLEAN_DIRECT_OUT

PUT1)#addsharedlibraryversionnumberSET_TARGET_PROPERTIES(helloPROPERTIESVERSION1.2SOVERSION1)#installlibrariesINSTALL(TARGETShel

lohello_staticLIBRARYDESTINATIONlibARCHIVEDESTINATIONlib)#installincludefileINSTALL(FILEShello.hDESTINATIONinclude)library目录下的CMakeLists.txtADD_

LIBRARY(libname[SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL]source1source2...sourceN)SHARED动态库STATIC静态库MODULE在使用dyld的系统有效,如果不支持dyld

,则被当作SHARED对待EXCLUDE_FROM_ALL参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建GET_TARGET_PROPERTY(VARtargetproperty)GET_TARGET_PROPERTY(OUT

PUT_VALUEhello_staticOUTPUT_NAME)MESSAGE(STATUS“Thisisthehello_staticOUTPUT_NAME:”${OUTPUT_VALUE})如果没有这个属性定义,则返回NOTFOUNDSET_TARGE

T_PROPERTIES(target1target2...PROPERTIESprop1value1prop2value2...)这条指令可以用来设置输出的名称,对于动态库还可以用来指定动态库版本和API版本例如:SET_TARGET_PROPERTIES(hello_sta

ticPROPERTIESOUTPUT_NAME"hello")——————————————————————————————————————SET_TARGET_PROPERTIES(helloPROPERTIESCLEAN_DIRECT_OUTPUT1)S

ET_TARGET_PROPERTIES(hello_staticPROPERTIESCLEAN_DIRECT_OUTPUT1)——————————————————————————————————————SET_TARGET_PROPERTIES(helloPROPERTIESVERSION

1.2SOVERSION1)VERSION指代动态库版本,SOVERSION指代API版本DynamicLinkLibrary“Dllhell”动态库新版本覆盖旧版本,但是却不兼容老版本ʅ(。◔‸◔。)ʃLinux上的Dll,

叫sharedlibrary它有三个名字1.共享库本身的文件名(realname),其通常包含版本号,比如libmath.so.1.1.1234共享库的命名必须如libname.so.x.y.z最前面使用前缀”lib”,中间是库的名字和后缀”.so”,最后三个数字是版本号。x是主版本号(Major

VersionNumber),y是次版本号(MinorVersionNumber),z是发布版本号(ReleaseVersionNumber)2.动态库的so-name(Shortforsharedobjectname),其是应用程序加载dll时候,其寻找共享库用的文件名。其格式

为lib+math+.so+(majorversionnumber)其只包含majorversionnumber,换句话说,也就是只要其接口没有变,应用程序都可以用,不管你其后minorbuildversionorbuildversion。软连接(SymbolLink);readelf-dshar

elibrary;ldconfig3.共享库的连接名(linkname),是专门为build阶段连接而用的名字。这个名字就是lib+math+.so,比如libmath.so。其是不带任何版本信息的。在共享库编译过程中,连接(link)阶段,编译器将生成一个共享库及real

name,同时将共享库的soname,写在共享库文件里的文件头里面。可以用命令readelf-dsharelibrary去查看。如用GCC的“-l”参数链接共享库libtXXX.so.3.8.1,只需要在编译器命令行指定-lXXX即可,省略了前

缀和版本信息。编译器会根据当前环境,在系统中的相关路径(往往由-L参数指定)查找最新版本的XXX库。这个XXX就是共享库的“链接名”Linux动态库的版本控制动、静态库的使用最后,我们来使用我们自己刚刚建立的库创建库与使用库可以在一个工程中进行在生成库的时候我们就可以添加一个test二进制文件并运

行它来检测我们的库是否成功生成INCLUDE_DIRECTORIES(/home/liqi/workspace/cmake/install_dir/include)LINK_DIRECTORIES(/home/liqi/workspace/cmake

/install_dir/lib)#SET(LIB/home/liqi/workspace/cmake/install_dir/lib/libhello.so)ADD_EXECUTABLE(demo5main.c)#MESSAGE(STATUS"EXT_LIB="${L

IB})#SET(EXECUTABLE_OUTPUT_PATH"${CMAKE_BINARY_DIR}/bin")TARGET_LINK_LIBRARIES(demo5hello.so)动、静态库的使用cmake_minimum_required(VERSION2.8.3)PROJECT

(demo5)ADD_SUBDIRECTORY(srcbin)主目录下的CMakeLists.txtsrc目录下的CMakeLists.txtLINK_DIRECTORIES(directory1directory2...)这个指令非常简单,添加非标准的共享库

搜索路径,比如,在工程内部同时存在共享库和可执行二进制,在编译时就需要指定一下这些共享库的路径TARGET_LINK_LIBRARIES(targetlibrary1<debug|optimized>library2...)这个指令可以用来为target添加需要链接的共

享库,本例中是一个可执行文件,但是同样可以用于为自己编写的共享库添加共享库链接动、静态库的使用使用ldd指令,查看是否库文件链接成功了

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?