当前位置: 首页 > news >正文

Cmake生成的Xcode工程相对路径与绝对路径的问题

Cmake生成的Xcode工程相对路径与绝对路径的问题

文章目录

  • Cmake生成的Xcode工程相对路径与绝对路径的问题
    • 前言
    • 修改`.pbxproj`文件
    • 验证工程
    • 小结

前言

由于Cmake的跨平台的自动化构建的方便性以及他广泛应用于编译过程的管理,在开发过程中难免用到Cmake。我也使用Cmake针对相关静态库进行编译,得到在iOS下使用的静态库,但由于Cmake生成的相关工程是绝对路径的,因此在合作开发过程中,别人不能够很方便的进行共同开发。我针对Cmake生成相对路径的工程又不熟悉,因此只能针对生成的Xcode工程进行从绝对路径到相对路径的改造,因此本文的操作方式可能不那么符合正常的工作流程
并且在相关的类似文章中,也有人提到Cmake生成的VScode工程是绝对路径,并且是有意为之的,相关文章:CMake生成的vs的工程文件为何采用的是绝对路径

使用的Cmake命令生成Xcode工程:Cmake . -G "Xcode"

修改.pbxproj文件

project.pbxproj文件是一个基于XML格式的文本文件,它存储了Xcode工程中几乎所有的配置信息,包括目标(Targets)、源文件(Source Files)、资源文件(Resources)、构建设置(Build Settings)等。在Xcode中,每当你对项目进行更改(如添加、删除或修改文件,更改构建设置等),这些更改都会反映到project.pbxproj文件中。 参考的相关文章:Xcode工程解析:深入了解project.pbxproj文件

.pbxproj文件也是Xcode中的Build Settings, General等设置的总和,一般来说在Xcode中通过GUI来修改项目配置,.pbxproj也会同步更新,但某些情况却不会,因此可能需要打开.pbxproj来修改。(本人操作可能不规范)
修改.pbxproj文件时,需要注意备份,以免关键数据丢失。
Note:应当尝试首先修改build settings中的内容,如果能够起作用,请不要修改.pbxproj文件。

修改的原则:根据自己通过Xcode建立的工程的.pbxproj文件进行对比,修改为相对路径

其中需要用到的配置项有 $(PROJECT_DIR)$(SRCROOT),它们分别表示项目根目录和项目目录。二者的区别: ( S R C R O O T ) 和 (SRCROOT)和 (SRCROOT)(PROJECT_DIR)和 ( i n h e r i t e d ) 和 (inherited)和 (inherited){PODS_ROOT}
如果不确定二者的路径到底是什么,可以通过以下命令来查看

xcodebuild -project projectName.xcodeproj -showBuildSettings | grep "SRCROOT"
xcodebuild -project projectName.xcodeproj -showBuildSettings | grep "PROJECT_DIR"
  1. 打开.pbxproj文件,可以搜索user等绝对路径中经常有的字段,这些就是要修改的绝对路径了。

在这里插入图片描述
2. 将projectDirPatrh的路径替换为如下内容

projectDirPath = ""; //代表将项目根目录的路径替换为当前目录

  1. 将绝对路径中的替换成当前工程的$(PROJECT_DIR),示例如下:
//未修改之前的代码,已脱敏
HEADER_SEARCH_PATHS = (/Users/xxxx/src/main,/Users/xxxx/src/main/xx,/Users/xxxx/src/main/xx,/Users/xxxx/src/main/xxxx,/Users/xxxx/src/main/xxx,/Users/xxxx/src/main/xxxx,/Users/xxxx/src/main/xxxxxxx,"$(inherited)",);
//修改为
HEADER_SEARCH_PATHS = ("$(PROJECT_DIR)/src/main","$(PROJECT_DIR)/src/main/xx","$(PROJECT_DIR)/src/main/xx","$(PROJECT_DIR)/src/main/xxxx","$(PROJECT_DIR)/src/main/xxx","$(PROJECT_DIR)/src/main/xxxx","$(PROJECT_DIR)/src/main/xxxxxxx","$(inherited)",);

类似的均这样修改. Note:.pbxproj文件中,使用$(PROJECT_DIR)要在路径前后加上双引号,上述代码已体现。

验证工程

在上述进行修改时,应当时不时的点击.pbxproj文件,看看是否能成功打开和索引工程中的文件,如果出现工程已损毁或者打开后工程文件索引不到,全部标红,说明刚刚修改的有错误。
这样防止在修改完后,发现工程无法运行,却无法定位问题位置。
在这里插入图片描述

在这里插入图片描述

  1. 修改完成后,可以上传到代码仓库中,再在电脑上另外一个位置clone下来;(上传到代码仓库中,应当忽略工程的中间文件)
  2. 打开工程文件,构建看是否成功,以及设置里的是否都是相对路径。

小结

本文主要讲述了在Cmake生成Xcode工程后,Xcode工程均为绝对路径的问题。给出了简单的修改为相对路径的方法以及操作步骤。本文仅供参考,面对您的工程时请谨慎操作,做好备份。
如果您觉得我写的不错,请记得给我一个免费的赞!

相关文章:

Cmake生成的Xcode工程相对路径与绝对路径的问题

Cmake生成的Xcode工程相对路径与绝对路径的问题 文章目录 Cmake生成的Xcode工程相对路径与绝对路径的问题前言修改.pbxproj文件验证工程小结 前言 由于Cmake的跨平台的自动化构建的方便性以及他广泛应用于编译过程的管理,在开发过程中难免用到Cmake。我也使用Cmake…...

“机器说人话”-AI 时代的物联网

万物互联的物联网愿景已经提了许多年了,但是实际效果并不理想,除了某些厂商自己的产品生态中的产品实现了互联之外,就连手机控制空调,电视机和调光灯都没有实现。感觉小米做的好一点,而华为的鸿蒙的全场景,…...

C#高级:数据库中使用SQL作分组处理3(ROW_NUMBER() 关键字)

一、分组后找出指定序号的数据 【需求】查出每个班级第三个注册入学的学生信息 【表和字段】Student: ID Class Name Registrationtime 【实现SQL】 WITH RankedStudents AS (SELECT ID,Class,Name,Registrationtime,ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Registra…...

光明乳业:以科技赋能品质,引领乳业绿色新未来

近日,光明乳业再次成为行业焦点,其在科技创新与绿色发展方面的卓越表现赢得了广泛赞誉。作为中国乳制品行业的领军企业,光明乳业始终坚守品质至上的原则,不断探索科技创新之路,致力于为消费者提供更高品质、更健康的乳…...

Footprint Analytics 助力 Core 区块链实现数据效率突破

Core 是一个基于比特币并兼容 EVM 的 Layer 1 区块链,正通过其创新解决方案引革新特币金融。作为首个引入非托管 BTC 质押协议及全球首个发行收益型 BTC ETP 产品的区块链,Core 站在了区块链技术的最前沿。通过利用超过 50% 的比特币挖矿哈希算力&#x…...

从零搭建pytorch模型教程(八)实践部分(二)目标检测数据集格式转换

前言 图像目标检测领域有一个非常著名的数据集叫做COCO,基本上现在在目标检测领域发论文,COCO是不可能绕过的Benchmark。因此许多的开源目标检测算法框架都会支持解析COCO数据集格式。通过将其他数据集格式转换成COCO格式可以无痛的使用这些开源框架来训…...

MYSQL(2) 高级查询

文章目录 概述高级查询基础查询条件查询范围查询判空查询模糊查询分页查询查询后排序分组查询 小结 概述 接上篇,上篇写到增删改查。这篇继续。 高级查询 基础查询 -- 全部查询 select * from student; -- 只查询部分字段 select sname, class_id from student;…...

小程序的运营方法:从入门到精通

随着科技的快速发展,小程序已成为我们日常生活和工作中不可或缺的一部分。小程序无需下载安装,即用即走的特点深受用户喜爱。那么,如何运营好一个小程序呢?下面就为大家分享一些小程序的运营方法。 一、明确目标用户 在运营小程序…...

【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现

1 绪论 1.1 研究背景与意义 在气候变化日益受到全球关注的背景下,天气气温的变化已经对人们的生活各方面都产生了影响,人们在外出时大多都会在手机上看看天气如何,根据天气的变化来决定衣物的穿着和出行的安排。[1]如今手机能提供的信息已经…...

掌握 Symfony 路由系统:配置与管理

掌握 Symfony 路由系统:配置与管理 Symfony 是一个非常流行的 PHP 框架,而路由系统是 Symfony 框架的核心组件之一。通过理解和掌握 Symfony 的路由系统,开发者可以更高效地配置和管理应用程序的 URL 结构,从而更好地控制应用程序…...

OpenTeleVision复现及机器人迁移

相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…...

气膜足球馆:经济高效的室内足球场馆解决方案—轻空间

如果你有一片足球场,想要建一个室内的足球馆,为什么不考虑一下气膜建筑呢?气膜建筑以其独特的优势和高性价比,成为现代体育场馆建设中的一匹黑马。它不仅具有传统建筑无法比拟的经济效益和快速施工优势,还在智能控制、…...

Vue3二次封装axios

官网: https://www.axios-http.cn/docs/interceptors steps1: 安装 npm install axios -ssteps2: /src/api/request.js 文件 >>> 拦截器 import axios from axios // 如果没用element-plus就不引入 import { ElMessage } from element-plusconst service axios.cre…...

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent(ProductManager)2-3、多智能体系统介绍2-4、多智能体案例分析2-4-1、构建智能体团队2-4-2、动作/行为 定义2-4-3、角色/智…...

C#中GridControl的数据源双向绑定

1. 什么是双向数据绑定? 双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步。这意味着当模型数据发生变化时,UI会自动更新,反之亦然。这种双向数据绑定极大地简化了UI和模型数据之间…...

sklearn详细基础教程(科普篇)

Scikit-learn(简称sklearn)是Python中一个强大且易于使用的机器学习库,它基于NumPy、SciPy和matplotlib等Python库构建,提供了丰富的工具集,包括数据预处理、特征选择、模型训练、评估和预测等功能。以下是sklearn的详…...

el-table列的显示与隐藏

需求:实现 表字段的显示与隐藏。效果图 代码实现 写在前面 首先 我部分字段有自定义的排序逻辑,和默认值或者 数据的计算 所以是不能简单的使用 v-for 循环column 。然后 我需要默认展示一部分字段,并且 当表无数据时 提示不能 显示隐藏 …...

使用命令快速删除项目中的node_modules

描述 直接调用了系统自带的命令行工具,无需额外安装任何第三方库或工具。 同时,这些命令经过优化,能够快速处理大量文件,从而实现快速删除。 步骤 1、进入项目文件夹; 2、如果是Mac/Linux 环境下,执行&a…...

leetCode15三数之和(双指针)

目录 1、题目 2、思路 3、代码 4、总结 1、题目 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为…...

数据挖掘-数据预处理

来自🥬🐶程序员 Truraly | 田园 的博客,最新文章首发于:田园幻想乡 | 原文链接 | github (欢迎关注) 文章目录 3.3.1 数据的中心趋势平均数和加权平均数众数,中位数和均值描述数据的离散程度 &a…...

云计算——弹性云计算器(ECS)

弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...