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

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

最近在编译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骗过去,先保证工程能够生成。

相关文章
|
8月前
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
1115 4
|
1月前
|
安全 前端开发 Linux
Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台
Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台
67 3
Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台
|
3月前
|
Unix Linux 编译器
windows下和linux下cmake的规则有区别吗
通过合理使用CMake的条件逻辑和平台特定的配置选项,开发者可以编写更加灵活和健壮的CMake脚本,确保项目在Windows和Linux上的一致性和可移植性。
182 76
|
3月前
|
存储 虚拟化 Docker
Docker Desktop 4.38 安装与配置全流程指南(Windows平台)
Docker Desktop 是容器化应用开发与部署的一体化工具,支持本地创建、管理和运行 Docker 容器。4.38 版本新增 GPU 加速、WSL 2 性能优化和 Kubernetes 1.28 集群管理功能,适用于微服务开发和 CI/CD 流水线搭建。安装要求为 Windows 10 2004 及以上(64 位),需启用 Hyper-V 或 WSL 2。硬件最低配置为 4GB 内存、20GB 存储和虚拟化技术支持的 CPU。安装步骤包括启用系统功能、下载并运行安装程序,完成后配置镜像加速并验证功能。常见问题涵盖 WSL 2 安装不完整、磁盘空间清理及容器外网访问等。
6717 14
|
3月前
|
固态存储 C++ 计算机视觉
Windows平台GIMP 2.10下载教程:零基础入门高级图像编辑
GIMP(GNU Image Manipulation Program)是一款开源跨平台图像编辑工具,支持图层管理、高级修图、色彩校正等功能,广泛应用于平面设计和照片修复。其优势包括全功能免费、插件生态丰富(600+扩展插件)、硬件要求低(1GB内存即可流畅运行)。本文详细介绍GIMP的软件定位、安装流程、首次配置及常见问题解答,帮助用户快速上手并充分利用其强大功能。
|
9月前
|
监控 Windows
Windows平台RTSP|RTMP播放器如何实时调节音量
我们在做Windows平台RTSP、RTMP播放器的时候,有这样的技术需求,特别是多路监控的时候,并不是每一路audio都需要播放出来的,所以,这时候,需要有针对音量调节的设计
152 1
|
9月前
|
监控 C# 块存储
Windows平台RTSP|RTMP播放器如何叠加OSD文字
做Windows平台RTSP|RTMP播放器的时候,特别是多路播放场景下,开发者希望可以给每一路RTSP或RTMP流添加个额外的OSD台标,以区分不同的设备信息(比如添加摄像头所在位置),本文主要探讨,如何动态添加OSD台标。
180 1
Windows平台RTSP|RTMP播放器如何叠加OSD文字
|
8月前
|
NoSQL Shell MongoDB
Windows 平台安装 MongoDB
10月更文挑战第10天
210 0
Windows 平台安装 MongoDB
|
8月前
|
存储 Linux 编译器
cmake的单目录和多目录的使用(Linux和Windows)
本文介绍了在Windows和Linux平台上使用CMake构建单目录和多目录项目的步骤,包括如何配置CMakeLists.txt文件以及如何生成和使用可执行文件、库文件。
325 2
|
9月前
|
Linux Android开发 iOS开发
Windows平台RTSP|RTMP播放器如何实现实时录像功能
Windows平台RTSP、RTMP播放器实时录像接口设计,实际上,除了Windows平台,我们Linux、Android、iOS平台也是一样的设计,单纯的录像模块,如果做的全面,也不是一两个接口可以搞定的
249 1