news 2026/9/6 5:02:44

Cmakelist进阶版

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cmakelist进阶版

目标:不只是能够自己能用上自己写的库,让别人也能用。

1.创建一个文件夹如下图所示,src存放库的.cpp文件,include存放库的.h文件,主程序是useHello.cpp

2.往include和src里面放你的文件,并且编写你的主程序引用这个库。此处略。

3.编写CMakeLists.txt文件(这一步比较关键,我尽可能的讲明白)如下图所示。注1:include_directories(include)找库的头文件。add_library(hello SHARED src/hello.cpp),add_library()声明需要生成一个库文件,SHARED表明这是一个动态库(如果不加就默认是静态库,动态库的作用就是能够多个程序共用),hello就是给源文件设置一个映射名,故此这句代码的完整意思是给源文件生成一个名为hello的动态共享库,执行这句代码会生成libhello.so这个共享动态库文件。add_executable,target_link_libraries看之前的文章前面有介绍。install(TARGETS hello LIBRARY DESTINATION lib)这条语句,当执行make install 时把之前add_library定义的hello动态库安装到指定的系统目录中,TARGETS hello:声明要安装的对象是hello(也就是前面add_library生成的那个动态库),LIBRARY:指定要安装的文件类型是动态共享库也就是.so文件。DESTINATION lib就是路径,最终路径是/usr/local/lib,其中/usr/local是默认路径,lib是自己指定的,默认路径可以改(读者自己去查CMAKE_INSTALL_PREFIX一般是改这个)。install(FILES include/hello.h DESTINATION include)这句代码同理,不过他是安装.h文件到指定路径。

4.编译。创建一个build文件,在build文件里面执行cmake .. ,make。那么你会得到如下图所示。一个.so文件(动态库共享文件)一个可执行文件。

5.执行可执行文件,指令./sayhello。那么你就会得到输出的结果。

6.执行sudo make install 注:这条指令是在build文件下执行,因为刚才编译的中间文件在这。结果如下图所示。

7.这时候你可以用指令具体查看。如下图所示。

8.执行sudo ldconfig。因为上一步只是安装,但是系统的缓存索引并没有更新,动态链接器查不到这个库。所以刷新一下缓存,解决这个问题。

9.(.h文件和.so文件)已经安装到了系统,那么现在需要写一个cmake文件去找到这两个文件,别人在用find_package()指令时Cmake会去调用这个脚本去找库。如下图所示。注:find_library()这是找库文件本身也就是.so文件,整体意思为在xxx路径下,找到xx文件,如果成功找到,那么就会返回文件路径给到设置的变量HEllo_LIBRARY。find_path同理。include(FindPackageHandleStandardArgs):引入cmake内置的模块,里面定义了一个函数find_package_handle_standard_args().而ind_package_handle_standard_args():第一个参数Hello,他是为了给find_package(Hello)设置的,调用find_package(Hello)Cmake就会自动搜索Findxxxx(Hello).cmake的文件,所以这里的大小写要严格匹配,并且cmake会基于他生成HELLO_FOUND(自动转全大写+_FOUND后缀)。DEFAULT_MSG ,cmake默认的消息提示格式,找或者没找到库都会输出默认提示给你。后面那两个就是需要检查的变量,前面知道这两个变量的值是路径(假设都找到的前提下),如果都是路径值那么就是查找成功,否则不成功。如果成功HELLO_FOUND的值会设置成true,否则为false。最后if一句就是赋值了,不细说。(高亮这里一定要全部大写,不然最后实验就会报错,而且你还不知道啥原因)

10.假设现在另外一个程序员想要用到我们的这个库。我们把全部打包给他,然后他找到FindHello.cmake文件,并且放到自己文件下,于此同时他还得编译一下我们的库并且sudo make install+sudo ldconfig才行。如下图所示。(程序员把文件放到cmake文件下了)。注意此时他是没有库的.cpp和.h文件的.它的Cmakelists可以如下图。

11.最后像之前编译一个C++文件执行即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 5:00:34

鸿蒙App接入AI多轮对话:基于蓝耘MaaS的礼物推荐实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 5:00:02

基于Python和Vue3的学科竞赛管理系统毕业设计全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 4:57:40

适配长辈日常聚会的K歌音响实用方案

长辈们退休之后,逐渐拥有了更多属于自己的休闲时间,不管是小区楼下和老伙计们聚会,还是逢年过节一家人团聚,唱两首歌都是很受欢迎的休闲项目。想要长辈玩得尽兴,选对K歌音响是关键,需要同时兼顾操作简单、音…

作者头像 李华
网站建设 2026/9/6 4:53:56

广州GEO优化服务商怎么选:五家选型参考

随着生成式AI成为信息获取的重要入口,GEO(生成式引擎优化)逐渐受到企业关注,广州及华南地区也有多家服务商开展相关业务。本文基于各企业公开资料与行业信息整理,对五家GEO服务商做客观梳理,不构成排名与推…

作者头像 李华
网站建设 2026/9/6 4:47:28

2026年西安场景化AI Agent开发,数商云企精准解决行业痛点

随着数字化转型进入深水区,单纯的信息化系统已难以满足企业对于“降本增效”的极致追求。2026年,西安作为西北地区的科创中心,企业对于AI技术的应用需求正从“概念验证”走向“规模化落地”。在这一背景下,陕西数商云企科技有限公…

作者头像 李华
网站建设 2026/9/6 4:43:07

Hy4 770B MoE模型发布与WorkBuddy AI工作台实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华