CMake中的find_package(xxx REQUIRED)在windows平台怎么解

news2024/11/15 4:06:40

最近在编译FastDDS时,遇到了这个问题,使用CMake构建时提示找不到库。
下载的源代码不能一次性编过是最让人头疼的问题,这种开源代码通常都是迭代了很多版本,各种配置信息如果不在文档中说明,全靠自己去摸索确实会让人头大,所以,我尽可能的把我遇到的问题分享出来,供大家参考,而不要在这种环境问题上就栽了大跟头。

今天就来介绍一下CMake中的find_package在windows平台该怎么配置,怎么使用。
以一个全新的例子说明,比如我们要在这里使用Dll库中的fnDll1()函数,就这么简单:

#include "Dll1.h"

#include <iostream>

using namespace std;

int main()
{
	std::cout << fnDll1() << std::endl;
	return 0;
}

为它编写一个CMakeLists.txt,方便生成vs工程:

cmake_minimum_required(VERSION 3.10)

project(test)

set(SRC_LIST src/main.cpp)

set(CMAKE_PREFIX_PATH "D:/test/Dll1")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "D:/test/Debug")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "D:/test/cmaketest/modules")

#here
find_package(DLL1 REQUIRED)

add_executable(test ${SRC_LIST})

target_include_directories(test PRIVATE ${DLL1_INCLUDE_DIR})
target_link_directories(test PRIVATE "D:/test/Debug")
target_link_libraries(test DLL1)

注意我们设置了一个CMAKE_MODULE_PATH路径,在这个路径下有一个FindDLL1.cmake

# 设置查找脚本的名称
set(DLL1_FIND_SCRIPT "FindDLL1.cmake")

# 定义查找库的过程
find_path(DLL1_INCLUDE_DIR
  NAMES Dll1.h
  PATHS ${CMAKE_PREFIX_PATH}
)

find_library(DLL1_LIBRARY
  NAMES DLL1
  PATHS ${CMAKE_PREFIX_PATH}
)

# 检查是否找到库的头文件和链接库
if (DLL1_INCLUDE_DIR AND DLL1_LIBRARY)
  set(DLL1_FOUND TRUE)
else ()
  set(DLL1_FOUND FALSE)
endif ()

# 提供库的相关变量
if (DLL1_FOUND)
  if (NOT DLL1_FIND_QUIETLY)
    message(STATUS "Found DLL1: ${DLL1_LIBRARY}")
  endif ()
else ()
  if (DLL1_FIND_REQUIRED)
    message(FATAL_ERROR "DLL1 library not found")
  else ()
    message(STATUS "DLL1 library not found")
  endif ()
endif ()

如果开源项目中没有形如FindDLL1.cmake的文件,通常就需要我们自己手写一个,这个文件的作用其实就是为了检查到底有没有这样的库存在。

或者如果你觉得写这样的文件太麻烦,不如生成工程后再手动配置三方库头文件和库文件,那你可以先创建一个空文件,把cmake骗过去,之后再自己手动配置。

最后来看一下目录结构:
在这里插入图片描述
(假设DLL1库已经编好了,并且头文件在“D:\test\Dll1”下,lib在“D:\test\Debug”目录下)
然后就可以使用cmake工具生成vs工程了:
在这里插入图片描述
打开工程,编译没有问题,查看配置项,可以发现cmake已经按我们指定的路径配置好了。
在这里插入图片描述
在这里插入图片描述
以上便是整个使用过程,之后再遇到这种问题不会头大了吧。

或者如文章中提到的,如果你觉得写这样的文件太麻烦,还不如手动配,那就可以先放置一个空文件,把CMake骗过去,先保证工程能够生成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/658881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea运行java项目提示异常: java.security.InvalidKeyException: Illegal key size

idea运行java项目提示异常&#xff1a;java.lang.IllegalArgumentException: java.security.InvalidKeyException: Illegal key size 参考&#xff1a;java.security.InvalidKeyException: Illegal key size_gqltt的博客-CSDN博客 产生错误原因&#xff1a;为了数据代码在传输过…

4、做什么类型的产品经理

1、如何选择适合自己的产品经理岗位 怎么选择适合自己的这个产品经理岗位呢&#xff1f;建议大家是先考虑行业&#xff0c;再考虑其他的。 考虑行业就是说我要做什么行业的产品经理,然后再考虑在这个行业里面具体的你要做前端还是后端或者是APP端&#xff0c;还是web端&#x…

【MySQL】不就是MySQL——索引

前言 嗨&#xff01;小伙伴们周末快乐呀&#xff01;想必你们周末都在家里边呆着吧&#xff0c;外面实在是太热了&#xff01;在家里吹着空调做着自己喜欢做的事情吧&#xff01;本期我们主要学习的是MySQL中的约束条件。 目录 前言 索引概述 外键约束 1.概念 2.语法 1.添加…

【HTML界面设计(二)】说说模块、登录界面

记录很早之前写的前端界面&#xff08;具体时间有点久远&#xff09; 一、说说模板 采用 适配器&#xff08;Adapter&#xff09;原理 来设计这款说说模板&#xff0c;首先看一下完整效果 这是demo样图&#xff0c;需要通过业务需求进行修改的部分 这一部分&#xff0c;就是dem…

ch8_2_CPU的指令周期,流水线技术

1.  指令周期 指令周期是指_ CPU从主存取出一条指令, 分析指令&#xff0c;加上执行这条指令的时间。 1.1指令周期 指令周期&#xff1a; 是指cpu&#xff0c;从内存中取出指令&#xff0c;并且执行一条指令所需要的全部时间。 比如 从内存单元中&#xff0c;取出操作数&…

【使用Neo4j进行图数据可视化】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

“面试造火箭,入职拧螺丝”2023最新最全的Java开发八股文合集来了

前言 金三银四招聘旺季马上就到了&#xff0c;不知道大家是否准备好了&#xff0c;面对金三银四的招聘旺季&#xff0c;如果没有精心准备那笔者认为那是对自己不负责任&#xff1b;就我们 Java 程序员来说&#xff0c;多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点…

Java016——Java输入输出语句

一、输出语句 Java常用的输出语句有三种&#xff1a; 1&#xff09;System.out.println(); 换行输出&#xff0c;输出后会自动换行。 //示例 System.out.println("Hello"); System.out.println("World");//输出 Hello World2&#xff09;System.out.pri…

LIN-物理层(收发器)

文章目录 一、显性和隐性二、LIN的供电电压说明三、LIN通道数3.1 单通道3.2 双通道3.3 四通道 一、显性和隐性 LIN总线协议规定其物理层收发器的显性&#xff08;Dominant , 逻辑 “ 0”&#xff0c;电气特性为GND(0V)&#xff09;和隐性电平&#xff08;Recessive , 逻辑 “ …

cgi接口原理(boa服务器)

CGI&#xff1a;通用网关接口&#xff08;Common Gateway Interface&#xff09;是一个Web服务器主机提供信息服务的标准接口。通过CGI接口&#xff0c;Web服务器就能够获取客户端提交的信息&#xff0c;转交给服务器端的CGI程序进行处理&#xff0c;最后返回结果给客户端。 b…

字符串概述

字符串 一、API二、字符串2.1字符串的构造方法2.2 字符串构造时的内存2.2.1 直接赋值时的内存模型2.2.2 由new创建时的内存模型 2.3 字符串的比较三、StringBuilder 一、API 目前已学过的两个API&#xff1a;Random和Scanner。 对记不清的API可以去JDK-API帮助文档进行查找。 …

基于matlab对现代相控阵系统中常用的子阵列进行建模分析

一、前言 本示例说明如何使用相控阵系统工具箱对现代相控阵系统中常用的子阵列进行建模并进行分析。 相控阵天线与传统碟形天线相比具有许多优势。相控阵天线的元件更容易制造;整个系统受组件故障的影响较小;最重要的是&#xff0c;可以向不同方向进行电子扫描。 但是&#xff…

分布式系统学习第一天 fastDFS框架学习

目录 1. 项目架构图 1.1 一些概念 1.2 项目架构图 2. 分布式文件系统 2.1 传统文件系统 3. FastDFS 3.1 fastDFS介绍 3.2 fastDFS安装 3.3 fastDFS配置文件 3.4 fastDFS的启动 3.5 对file_id的解释 4. 上传下载代码实现 5. 源码安装 - 回顾 1. 项目架构图 1.1 一…

JDK8-2-流(2)- 流操作

JDK8-2-流&#xff08;2&#xff09;- 流操作 上篇 JDK8-2-流&#xff08;1&#xff09;-简介 中简单介绍了什么是流以及使用流的好处&#xff0c;本篇主要介绍流的操作类型以及如何操作。 如何返回一个流 ① collection.stream 即调用集合 java.util.Collection 下的 stre…

大学生如何申请一台免费服务器?

大学生如何申请一台免费服务器&#xff1f;阿里云学生服务器免费申请&#xff1a;高效计划&#xff0c;可以免费领取一台阿里云服务器&#xff0c;如果你是一名高校学生&#xff0c;想搭建一个linux学习环境、git代码托管服务器&#xff0c;或者创建个人博客网站记录自己的学习…

【小米技术分享】MySQL:一条数据的存储之旅

大家好&#xff0c;我是你们的小米&#xff0c;一个热爱技术分享的活泼小伙伴&#xff01;今天&#xff0c;我来给大家揭开一个神秘的面纱&#xff0c;带你们深入了解一下MySQL数据库是如何保存一条数据的。 客户端 首先&#xff0c;让我们从客户端&#xff08;Client&#x…

【雕爷学编程】Arduino动手做(114)---US-015高分辨超声波模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【免费】【sci】考虑不同充电需求的电动汽车有序充电调度方法(含matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现sci文献《A coordinated charging scheduling method for electric vehicles considering different charging demands》&#xff0c;主要实现电动汽车协调充电调度方法&#xff0c;该方法主要有以…

如何使用PyTorch 在 OpenAI Gym 上的 CartPole-v0 任务上训练深度 Q 学习(DQN)智能体

强化学习&#xff08;DQN&#xff09;教程 本教程说明如何使用 PyTorch 在 OpenAI Gym 上的 CartPole-v0 任务上训练深度 Q 学习&#xff08;DQN&#xff09;智能体。 任务 智能体必须在两个动作之间做出决定-向左或向右移动推车-以便使与之相连的杆子保持直立。 您可以在 G…

存储笔记7 NAS

NAS  Describe NAS, its benefits and components  Discuss different NAS implementations  Describe NAS file-sharing protocols  Discuss NAS management options File Sharing Environment 文件系统&#xff1a;存储组织数据文件的结构化方式文件共享 网络存储…