cmake多文件、多文件夹编译(2)

news2024/11/24 10:53:17

一、同级文件夹下代码调用问题

目录如下:

./testCMake(根目录):

        /build:

        /MyClass:

                CMakeLists.txt

                MyClass.cpp

                MyClass.h

        /MyFunction:

                CMakeLists.txt

                MyFunction.cpp

                MyFunction.h

        CMakeLists.txt

        main.cpp

        上述文件调用关系为:main.cpp调用MyClass.h和MyFunction.h;同级目录下的MyFunction.h调用另外一个同级目录下MyClass.h。上述文件内容具体如下:

./MyClass/CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
set(CMAKE_CXX_STANDARD 14)
#搜集MyClass目录下的文件
aux_source_directory(. MYCLASS_SOURCE)
#生成链接库
add_library(MyClass ${MYCLASS_SOURCE})

./MyClass/MyClass.cpp

#include "MyClass.h"

void MyClass::test(std::string s){

	std::cout<<"----"<<s<<std::endl;
}

./MyClass/MyClass.h

#pragma once
#include <iostream>
#include <string>

class MyClass{
	public:
	void test(std::string);
};

./MyFunction/CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 14)
#生成链接库
add_library(MyFunction MyFunction.h MyFunction.cpp)
#目标链接库MyFunction添加链接库MyClass
target_link_libraries(MyFunction MyClass)
#将目录MyClass添加的目标目录中
target_include_directories(MyFunction PUBLIC ..)

./MyFunction/MyFunction.cpp

#include "MyFunction.h"

void MyFunction(){
	MyClass myClass;
	myClass.test("MyFunction");
}

./MyFunction/MyFunction.h

#pragma once
#include "MyClass/MyClass.h"

void MyFunction();

./CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)
#添加子目录 MyClass/ 并且也会处理 MyClass目录下的 CMakeLists.txt文件
add_subdirectory(MyClass)
add_subdirectory(MyFunction)
#生成可执行文件 HelloWorld
add_executable(HelloWorld main.cpp)
#将可执行文件添加链接库MyFunction
target_link_libraries(HelloWorld MyFunction)
#将目录MyFunction添加到HelloWorld目标路径中
target_include_directories(HelloWorld PUBLIC MyFunction)
target_include_directories(HelloWorld PUBLIC MyClass)

./main.cpp

#include <iostream>
// 下面与./CMakeLists.txt中的target_include_directories(HelloWorld PUBLIC MyFunction)
// 和target_include_directories(HelloWorld PUBLIC MyClass)配套
// 如果不加这两句,下列两句应该写成 #include"MyClass/MyClass.h"和#include"MyFunction/MyFunction.h" 
#include"MyClass.h"
#include"MyFunction.h"

int main()
{
	MyClass myClass;
	myClass.test("main");
	
	MyFunction();
	
	return 0;
}

二、CMakeLists.txt第三方库添加问题

        该项目添加的第三方库有boost,opencv,paddleOCR,paddleX,websocketpp,海康工业相机SDK,海康监控摄像头SDK。

工程目录结构图如下:

 ./CMakeLists.txt

cmake_minimum_required (VERSION 3.12)
project (JMC_AI_VISION)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)  # 生成与路径无关代码
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++11 -fpermissive -O2 ${SSE_FLAGS}")

SET(DEPS "" CACHE PATH "Location of libraries")
set(EXTERNAL_LIB "-ldl -lrt -lgomp -lz -lm -lpthread")
set(DEPS ${DEPS} ${EXTERNAL_LIB})

# boost
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
#find_package(Boost)
#message( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
#message( STATUS "    Boost_LIBRARIES = ${Boost_LIBRARIES}")
#message( STATUS "    Boost_LIB_VERSION = ${Boost_LIB_VERSION}")

#set(DEPS ${DEPS} ${Boost_LIBRARIES})
#include_directories(${Boost_INCLUDE_DIRS})

#OPENCV
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

set(DEPS ${DEPS} ${OpenCV_LIBS})
include_directories(${OpenCV_INCLUDE_DIRS})

#paddleOCR
include_directories("/paddle/paddle_inference/third_party/install/protobuf/include")
include_directories("/paddle/paddle_inference/third_party/install/glog/include")
include_directories("/paddle/paddle_inference/third_party/install/gflags/include")
include_directories("/paddle/paddle_inference/third_party/install/xxhash/include")
include_directories("/paddle/paddle_inference/paddle/include")
include_directories("/paddle/PaddleOCR-release-2.6/deploy/cpp_infer/build/third-party/extern_autolog-src")
 
link_directories("/paddle/paddle_inference/third_party/install/protobuf/lib")
link_directories("/paddle/paddle_inference/third_party/install/glog/lib")
link_directories("/paddle/paddle_inference/third_party/install/gflags/lib")
link_directories("/paddle/paddle_inference/third_party/install/xxhash/lib")
link_directories("/paddle/paddle_inference/paddle/lib")

#set(DEPS ${DEPS} /paddle/paddle_inference/paddle/lib/libpaddle_inference${CMAKE_SHARED_LIBRARY_SUFFIX})
set(DEPS ${DEPS} glog gflags protobuf xxhash cryptopp)

#paddleX
include_directories("/paddle/PaddleX/deploy/cpp/encryption/include")
include_directories("/paddle/PaddleX/deploy/cpp/model_deploy/common/include")
include_directories("/paddle/PaddleX/deploy/cpp/model_deploy/engine/include")
include_directories("/paddle/PaddleX/deploy/cpp/model_deploy/paddlex/include")
include_directories("/paddle/PaddleX/deploy/cpp/model_deploy/ppclas/include")
include_directories("/paddle/PaddleX/deploy/cpp/model_deploy/ppdet/include")
include_directories("/paddle/PaddleX/deploy/cpp/model_deploy/ppseg/include")
include_directories("/paddle/PaddleX/deploy/cpp/model_deploy/utils/include")
include_directories("/paddle/PaddleX/deploy/cpp")
include_directories("/paddle/PaddleX/deploy/cpp/build/ext/yaml-cpp/src/ext-yaml-cpp/include")
 
link_directories("/paddle/PaddleX/deploy/cpp/build/ext/yaml-cpp/lib")
link_directories("/paddle/paddle_inference/third_party/install/cryptopp/lib")
link_directories("/paddle/PaddleX/deploy/cpp/build/lib")

set(DEPS ${DEPS} yaml-cpp cryptopp model_infer)


#websocket
find_package(websocketpp REQUIRED)
include_directories(${websocketpp_INCLUDE_DIRS})
#include_directories("/paddle/websocketpp-master")
#link_directories("/paddle/websocketpp-master")

set(DEPS ${DEPS} ${websocketpp_LIBRARIES})

#message("-----websocketpp_LIBRARIES = ${websocketpp_LIBRARIES}")


#hk_i_camera and hk_s_camera
find_library(MVS_LIB_I MvCameraControl HINTS ${PROJECT_SOURCE_DIR}/third_party/hk_cam_i/lib REQUIRED)
include_directories(${PROJECT_SOURCE_DIR}/third_party/hk_cam_i/ind)
set(DEPS ${DEPS} ${MVS_LIB_I})

#include_directories("/opt/MVS/include")
#link_directories("/opt/MVS/lib/64/")
find_library(MVS_LIB_S hcnetsdk HINTS ${PROJECT_SOURCE_DIR}/third_party/hk_cam_s/lib ${PROJECT_SOURCE_DIR}/third_party/hk_cam_s/lib/HCNetSDKCom REQUIRED)
find_library(ctrllib PlayCtrl HINTS ${PROJECT_SOURCE_DIR}/third_party/hk_cam_s/lib)
include_directories(${PROJECT_SOURCE_DIR}/third_party/hk_cam_s/ind)
set(DEPS ${DEPS} ${MVS_LIB_S})
set(DEPS ${DEPS} ${ctrllib})

message("-----DEPS = ${DEPS}")

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
 
add_subdirectory(zyyai)
add_subdirectory(zyyocr)
# add_subdirectory(jmc)
include_directories(${PROJECT_SOURCE_DIR})

add_executable(spare_tire_running spare_tire_main.cpp spare_tire.cpp JMC_common.cpp JMC_device.cpp web_socketpp.cpp)
# ADD_DEPENDENCIES(spare_tire_running ext-yaml-cpp)
target_link_libraries(spare_tire_running ${DEPS} zyyAi zyyOCR)

./zyyai/CMakeLists.txt

include_directories(
    ${PROJECT_SOURCE_DIR}/zyyai
)
aux_source_directory(. LIB_SRCS)			    # 添加当前目录下所有的源文件
add_library (zyyAi ${LIB_SRCS})				# 当前目录下的文件生成一个链接库
target_link_libraries(zyyAi ${DEPS})

#set(DEPS ${DEPS} ${zyyAi})

./zyyocr/CMakeLists.txt

include_directories(
    ${PROJECT_SOURCE_DIR}/zyyocr
)
aux_source_directory(. LIB_SRCS)			    # 添加当前目录下所有的源文件
add_library (zyyOCR ${LIB_SRCS})				# 当前目录下的文件生成一个链接库
target_link_libraries(zyyOCR ${DEPS})

#set(DEPS ${DEPS} ${zyyOCR})

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

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

相关文章

day35-Postman/ajax

0目录 1.postman 2.ajax 1.Postman 1.1 定义&#xff1a;postman用于测试http协议接口&#xff0c;无论是开发还是测试人员 1.2 Servlet中的doGet&#xff08;&#xff09;/daPost…

基于JavasSwing+MySQL的医药销售管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/87987881?spm1001.2014.3001.5503 功能&#xff1a;管理员与普通用户两个角色登录&#xff0c;可以增删改查用户&#xff0c;增删改查药品等功能 JDK1.8 MySQL5.7

微信小程序——开发入门

注册小程序 微信公众平台 设置相关信息 设置好之后需要去获取appID和秘钥&#xff0c;后序开发需要用到。 下载开发工具并安装 微信开发者工具&#xff08;稳定版 Stable Build&#xff09;下载地址与更新日志 | 微信开放文档 创建项目 打开开发者工具创建一个新项目并如下…

使用 ONLYOFFICE 宏检索网站详细信息

在上一篇文章中&#xff0c;我们基于一位用户发送的 VBA 参考构建了一个功能完善的 ONLYOFFICE 宏。今天&#xff0c;我们想再进一步&#xff0c;为其添加一些 Whois API 功能。 什么是 ONLYOFFICE 宏 如果您是一名资深 Microsoft Excel 用户&#xff0c;那么相信您已对于 VBA…

Nacos(服务注册与发现)+SpringBoot+openFeign项目集成

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

分割1——图像分割的前世今生

首先讲讲&#xff1a;什么是计算机视觉&#xff1f; 计算机视觉是一门让计算机学会“看”的学科&#xff0c;研究如何自动理解图像和视频中的内容。 其次讲讲&#xff1a;计算机视觉有哪些任务&#xff1f;我们所要讲的图像分割位于什么地位&#xff1f; 计算机视觉的三大经典…

计算机体系结构基础知识介绍之使用动态调度、多重问题和推测来利用流水线

我们已经了解了动态调度、多发射和推测等单独的机制是如何工作的。&#xff08;具体请参见本人前几篇博客&#xff09; 现在我们把这三种机制结合起来&#xff0c;得到一种和现代微处理器非常相似的微架构。为了简单起见&#xff0c;我们只考虑每个时钟周期发射两条指令的情况…

《算法竞赛·快冲300题》每日一题:“窗户”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 窗…

es6 数组操作个人总结

es6 数组操作个人总结 动机数组数组生成可枚举对象转数组箭头函数筛选判断所有元素枚举循环 小结 动机 es6 &#xff0c;说白了&#xff0c;就是增强版本的 js 。。。。。嗯&#xff0c;说到底&#xff0c;还是原生 js 罢了&#xff0c;不过比原有的 js 多了一些属性、类型、指…

【c++修行之路】智能指针

文章目录 前言为什么用智能指针智能指针简单实现unique_ptrshared_ptr 循环引用和weak_ptr的引入循环引用weak_ptr 定制删除器 前言 大家好久不见&#xff0c;今天来学习有关智能指针的内容~ 为什么用智能指针 假如我们有如下场景&#xff1a; double Div() {int x, y;cin …

Clion 配置Mingw64的 c++开发环境

1、Mingw64的安装与环境变量的配置 Mingw64文件下载 Mingw64下载地址&#xff1a;https://sourceforge.net/projects/mingw-w64/files/ posix相比win32拥有C 11多线程特性&#xff0c;sjlj和seh对应异常处理特性&#xff0c;sjlj较为古老&#xff0c;所以选择seh 配置环境变…

MongoDB踩过的坑

目录 启动MongoDB服务 可视化工具&#xff1a;MongoDB Compass 由于目标计算机积极拒绝&#xff0c;无法连接 BSONObj size: xxxx is invalid. Size must be between 0 and 16793600 (16MB) 启动MongoDB服务 1. 打开CMD 2. 进入安装MongoDB文件夹中的bin目录 3. mongod -…

mapBox 绘制多边形无法设置 边框宽度 解决方法

目录 一、问题 二、解决方法 三、总结 tips:如嫌繁琐&#xff0c;直接看有颜色的文字即可&#xff01; 一、问题 1.使用mapBox在地图上绘制点、线、面。绘制多边形的时候发现 直接用 zh(一家提供地图引擎的公司),提供的绘制多边形的方法无法设置边框颜色和边框宽度。很是离…

龙蜥社区 6 月技术委员会会议召开!欢迎 5 位开放原子 TOC 导师加入

2023 年 6 月 16 日上午 10 点召开了龙蜥社区 6 月技术委员会线上会议&#xff0c;共计 38 人参会。本次会议由联通肖微主持&#xff0c;会议也荣幸的邀请到了开放原子 TOC 导师线上参会&#xff0c;技术委员们来自阿里云、统信、飞腾、中科方德、红旗、万里红、Intel、Arm、龙…

入门篇:从零上手GitOps

文章目录 GitOps 介绍如何将业务代码构建为容器镜像&#xff1f;如何将容器镜像部署到K8s&#xff1f;K8s如何实现自动扩容和自愈&#xff1f;1.传统的扩容和自愈2.k8s自愈机制3.k8s弹性扩容 如何借助GitOps实现应用秒级自动发布和回滚&#xff1f;1.传统 K8s 应用发布流程2.从…

高级细腻的家居照明,欧瑞博智能无主灯是怎么实现的?

作者 | 辰纹 来源 | 洞见新研社 如今的现代生活&#xff0c;人类对光的需求已超越简单照明&#xff0c;而是希望在不同场景下能有专属的细腻用光体验&#xff0c;智能照明应运而生&#xff0c;并成为上升趋势。现阶段&#xff0c;精细化家居需求要求智能照明不仅要巧妙融合美学…

二叉树进阶(AVLTree)

目录 1.AVLTree概念 2.AVLTree模拟实现 2.1 AVLTree节点 2.2 插入实现基本框架 2.3 左单旋 2.4 右单旋 2.5 LR双旋 2.6 RL双旋 2.7 AVLTree树验证 1.AVLTree概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#…

怎么从电影中截取动图?试试这个工具

图片、视频等都是当代流行的表达情感、传递信息的一种方式。其中&#xff0c;当属gif动图最受大众的欢迎&#xff0c;它比普通的静态图片画面丰富&#xff0c;又比视频的体积小。那么&#xff0c;如何从视频中截取动图呢&#xff1f;使用GIF中文网的视频转gif&#xff08;https…

通过platform实现阻塞IO来驱动按键控制LED灯的亮灭

通过platform阻塞IO来驱动按键控制LED灯的亮灭 a .应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c .number的值随着按键按下而改变&#xff08;按键中断)例如number0按下按键number1 ,再次按下按键number0 d .在按下按键的时候需要同时将…

【Leetcode】42.接雨水(困难)

一、题目 1、题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6…