CMake下头文件和链接库的使用

2023-05-16

一、头文件与链接库文件的区别

头文件:申明函数接口
库文件:存放函数的定义
库文件通过头文件向外导出接口,用户通过头文件找到库文件中需要的函数实现代码进行链接至程序当中。

二、静态链接库(lib)与动态链接库(dll)的区别

  1. 静态链接库将文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要该库文件。动态链接库将被调用的函数所在的文件模块(dll)和调用函数在文件中的位置等信息链接进目标程序,程序运行时在从dll中寻找相应函数代码,此时仍然需要dll文件的支持。
  2. 采用静态链接库时,lib中的所有指令全部被包含在最终生成的exe文件中。使用动态链接库,则该dll不必要被包含在最终的exe文件中,exe文件执行时可以“动态”地引用和卸载这个与exe文件独立的dll文件。
  3. 库中代码被载入的时刻:
    静态库在程序编译时被链接到目标代码中。
    动态库在编译时被引用,在程序运行时才被载入。

三、CMake中添加头文件与链接库

# 添加子目录
add_subdirectory()

# 查找当前目录下的所有源文件
aux_source_directory()

# 添加头文件目录
# 相当于环境变量中增加路径到INCLUDE_PATAH路径
include_directories()

# 添加需要链接的库文件目录
# 相当于在环境变量中增加LIBRARY_PATH路径
link_directories()

四、使用一个简单的项目展示

新建项目,项目名为TestAdd,添加文件夹和源文件头文件如下图所示:在这里插入图片描述
CMakeLists.txt

# cmake最低版本号要求
cmake_minimum_required(VERSION 3.14)

# 项目名
project(TestAdd)

# 添加头文件
include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

# 添加连接库
link_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/lib
)

# 指定生成目标
add_executable(TestAdd main.cpp lib/add.cpp include/add.h)

add.h

#ifndef TESTADD_ADD_H
#define TESTADD_ADD_H

int add(int n1,int n2);

#endif //TESTADD_ADD_H

add.cpp

#include "../include/add.h"

int add(int n1,int n2)
{
    return n1+n2;
}

main.cpp

#include <iostream>
#include "add.h"
using namespace std;

int main() {
    int a=1,b=2;
    cout<< add(a,b);
}

运行程序:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake下头文件和链接库的使用 的相关文章

  • 无法在 Visual Studio 和 vcpkg 中构建 cmake 项目(致命错误 C1083)

    我今天安装了vcpkg 启用了与Visual Studio的集成 即 vcpkg集成安装 并开始安装库 我基本上安装了 cpprestsdk 并触发了 boost 库的安装 然后我在 Visual Studio CMake 中打开该项目 当
  • doxygen INSTALL 无法将文件“.../doxygen/build/bin/doxygen”复制到“/usr/local/bin/doxygen”

    解决了一些之后最初的问题 https stackoverflow com q 50986047 4120196在尝试让 doxygen 工作时 我在遵循以下步骤时偶然发现了下一个错误doxygen安装教程 http www doxygen
  • 在 Android Studio 中使用预构建的共享库

    我需要在我的 android 项目中使用自定义的预构建共享库 在独立 ndk 上构建为 libdynamic so 我在路径 src main 中创建了一个文件夹 jniLibs 然后在其中创建了 4 个文件夹 即 armeabi arme
  • CMake Xcode生成器创建了一个无法构建的项目

    我有一个使用 CMake 构建系统的 C 项目 我使用 MacBook Pro 进行开发 因此当我使用终端时 一切都非常顺利 我可以构建我的项目 然而 今天我发现我可以在使用 CMake 生成器创建相应的项目后使用 Xcode gt cma
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 是否可以使用 gold 链接器编译和链接 Clang/LLVM?

    我正在为 LLVM Clang 编写自定义通道 重新编译往往需要一段时间并使用大量内存 我听说 gold 链接器 1 比标准 ld 链接器花费更少的时间并且 2 使用更少的内存 有没有办法将标志传递到 LLVM Clang 构建过程并更改为
  • CMake - 将预构建库链接到 C# 项目

    我正在使用 CMake 构建 C 库 该库依赖于已构建的库 dll 我似乎无法让图书馆链接到我的图书馆 我尝试过使用target link libraries mylib external lib 我也尝试过暴力破解 reference e
  • 在cmake中,什么是“项目”?

    这个问题是关于project命令 推而广之 是什么concept of a project意思是cmake中的 我真的不明白什么是project是 以及它与target 我想我确实理解 我看了一下cmake 文档project http w
  • 如何使用 --build 选项查看 cmake 发出的命令

    当我运行 cmake build target INSTALL 命令时 如何查看发出的命令 似乎没有像 versbose之类的选项 cmake 帮助说 cmake build 是底层构建工具的接口 但没有说明有关发出的命令转储的任何内容 我
  • 为 CMake 中的子目录生成“干净”目标

    我想生成一个clean子目录的目标 我的项目结构是这样的 app A B lib A B C 有时我只想在 app A 上运行干净 并且不想清理库 是否可以告诉 CMake 生成clean每个目录的目标 或者像这样的自定义目标应用程序清理哪
  • cmake 包括其他目录中的 h 文件

    我在 cmake 项目下进行测试时遇到问题 我的项目是这样安排的 TerrainMap PointAccumulator heightQuadGrid Test 在 TerrainMap 目录中 CMakeLists txt 文件简单地概述
  • 在 Ubuntu 16.04 上编译 PCL 1.7,CMake 生成的 Makefile 中出现错误

    我正在尝试让 PCL 1 7 点云库 而不是其他 pcl 在 Ubuntu 16 04 上运行 我最终希望用于 C 的东西 但现在我只是想让这些例子工作 我使用的是 Ubuntu GNU 5 3 1 附带的默认编译器和 Cmake 版本 3
  • Cmake 错误:无效的转义序列 \U

    使用 CMake 在 VC 10 中运行 OpenCL 代码时 出现以下错误 CMake Error at CMakeLists txt 6 set Syntax error in cmake code at C Users Shreedh
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 使用星号更改多个源文件的 CMake 编译器标志

    我正在尝试调试与编译器优化相关的问题 O2 或以下版本没有问题 O3 出现段错误 并且我希望能够切换我的源代码块的编译器标志 以便我可以尝试缩小段错误的来源范围 我可以将全局优化级别设置为 O2 并更改单个文件的属性 如下所示 SET SO
  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • CMake:使用其他平台的生成器。如何?

    如何使用 CMake 在 Linux 上生成 Visual Studio 项目文件 你不能 您必须在 Windows 上运行 CMake 才能为 Visual Studio 生成

随机推荐

  • 展讯8910DM:如果VBus和VBat接在一起,导致模组某些功能出现异常的问题分析

    一 无法通过调节电压进行正常开关机 Bug 在idh code components driver Kconfig以及drv charger c中对开关机电压进行配置后 外接电源调节电压对模组进行开关机测试 通过coolwatcher抓取l
  • Linux:xinetd服务安装与配置(操作环境:Ubuntu 18.04)

    xinetd服务简介 xinetd是一个守护进程 属于系统中的一个后台进程 周期性的执行某些任务 或者等待某个事件发生 不会随着用户的注销而退出 支持对tcp udp RPC服务 但是当前对RPC的支持不够稳定 基于时间段的访问控制 功能完
  • 【工作感悟】99%即是不成功

    今晚由于修改代码导致cpu使用率爆满 xff0c 然后疯狂地 kill 9 xxxx 事后究其原因 xff0c 还是我没有考虑完善 xff0c 很多事情都是考虑到眼前一段时间 xff0c 而非一个月之后怎么样 xff0c 一年之后怎么样 反
  • centos 自带python 2.6 链接mysql 报错

    mysql python安装时EnvironmentError mysql config not found error command 39 gcc 39 failed with exit status 1 参考 https www cn
  • Spring Boot自定义log4j2日志文件 按天记录

    转载 https www cnblogs com advancing p 7922463 html Spring Boot自定义log4j2日志文件 背景 xff1a 因为从 Spring Boot 1 4开始的版本就要用log4j2 了
  • datax fieldDelimiter ’\001’ fieldDelimiter": “\u0001”!!!

    原文 xff1a https blog csdn net Angular need article details 84000592 作者 xff1a Angular need 来源 xff1a CSDN 2 datax把数据从Mysql导
  • GPG key retrieval failed: [Errno 14] Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

    运维给分配了一个新的服务器 xff0c 发现服务器上并没有安装mysql xff0c 一些shell脚本调用的mysql命令就无法使用 xff0c 随后开始安装mysql xff0c 本来准备请运维帮忙安装 xff0c 但是运维说自己装吧
  • golang go get中断问题解决: git 推送出现 "fatal: The remote end hung up unexpectedly" 解决方案

    转自 https blog csdn net weixin 38450840 article details 80701173 git 推送出现 fatal The remote end hung up unexpectedly 解决方案
  • Maven 镜像源配置

    settings xml 文件 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt settings xmlns 61 34 http maven apache org SET
  • 前端免费模板

    最近发现了一个前端免费模板 xff0c 分享给大家 xff1a http www mobanwang com mb
  • Postman 使用教程

    关注 开源Linux xff0c 选择 设为星标 回复 学习 xff0c 有我为您特别筛选的学习资料 postman是一款支持http协议的接口调试与测试工具 xff0c 其主要特点就是功能强大 xff0c 使用简单且易用性好 无论是开发人
  • 3.卡尔曼滤波理论基础之最优估计(最小方差估计)

    文章目录 一 最小方差估计例子 二 线性最小方差估计三 其他最优估计1 极大验后估计2 极大似然估计 四 总结 一 最小方差估计 前两篇文章对最优估计中的最小二乘估计进行了较为系统的介绍 我们已经知道 xff0c 所谓最优估计就是让估值结果
  • YOLOV4与YOLOV3的区别

    YOLOV4与YOLOV3的区别 A big bliss的博客 CSDN博客 yolov3和yolov4的区别 首先 xff0c 先大概的说下二者之间的差别 xff1a 1 特征提取网络的不同 2 激活函数的不同 3 loss的不同 4 数
  • HTTP Authorization

    HTTP Authorization 授权流程 在项目中往往需要对访问的请求进行安全认证 xff0c 只有认证通过的请求 xff0c 才能进行相关的操作 开发者需要颁发 AccessKey 和 SecretKey 给用户 xff0c 用户如
  • 求助!!tensorflow无法调用GPU计算。。

    求助 xff01 xff01 tensorflow无法调用GPU计算 如题 xff0c 本人是小白级别的爱好者 xff0c 使用的是联想台式机 xff0c win10系统 xff0c 有一块GeForce GT730的独立显卡 xff0c
  • C++系列: 嵌套命名空间

    目录 1 什么是嵌套命名空间 xff1f 2 实验 2 1 外部引用嵌套命名空间内的符号 2 2 命名空间内容不同层次间符号的引用 3 最后 1 什么是嵌套命名空间 xff1f 嵌套命名空间就是在命名空间里面在定义其它的命名空间 xff0c
  • 树莓派:ssh“疯掉”了

    昨晚 xff0c 电脑用ssh连接不了树莓派 我非常淡定 xff0c 首先在树莓派上打开配置 xff0c 看看ssh有没有打开 xff0c 很明显 xff0c 一直开着的 嗯 xff0c 可能无线连接的分配的ip地址变了 于是 xff0c
  • 串口通信协议

    1 串口通信协议简介 串口通信 xff08 serial communication xff09 是一种设备间非常常用的串行通信方式 xff0c 大部分电子设备都支持 xff0c 电子工程师再调试设备时也经常使用该通信方式输出调试信息 2
  • vim 实现批量注释

    vim 实现批量注释 第一种方法 批量插入字符快捷键 xff1a Ctrl 43 v进入VISUAL BLOCK xff08 可视块 xff09 模式 xff0c 按 j xff08 向下选取列 xff09 或者 k xff08 向上选取列
  • CMake下头文件和链接库的使用

    一 头文件与链接库文件的区别 头文件 xff1a 申明函数接口 库文件 xff1a 存放函数的定义 库文件通过头文件向外导出接口 xff0c 用户通过头文件找到库文件中需要的函数实现代码进行链接至程序当中 二 静态链接库 xff08 lib