xcconfig(环境变量) 的使用

news2024/10/6 8:21:53

xcconfig(环境变量) 的使用

文章目录

  • xcconfig(环境变量) 的使用
    • 一、上手使用
      • 1、添加 xcconfig 文件
      • 2、在文件中添加数据
      • 3、将文件配置到工程中
      • 4、使用环境变量
      • 5、使用 Pod 的项目
    • 二、语法
      • 1、注释:
      • 2、包含语句:
      • 3、变量
      • 4、变量分配
      • 5、重写
      • 6、继承
    • 三、相关概念
      • workspace
      • project
      • target
      • configuration & build settings
      • scheme
    • 四、常见环境变量
    • 五、build Settings 常见参数
    • 六、OBJC 环境变量
    • 参考


一、上手使用

1、添加 xcconfig 文件

一般需要添加 Release 和 Debug 版本,这两者公用的数据,也可以添加一个通用的文件,比如我这里通用的叫做 Config.xcconfig
在这里插入图片描述


2、在文件中添加数据

字符串不需要加 引号

对通用文件的引用,使用 #include


在这里插入图片描述


3、将文件配置到工程中

在这里插入图片描述


可以通过终端查看所有 build setting,比如本项目中数据如下

$ cd /Users/dv/Desktop/XcconfigDemo 
$ xcodebuild -list
Information about project "XcconfigDemo":
    Targets:
        XcconfigDemo

    Build Configurations:
        Debug
        Release

    If no build configuration is specified and -scheme is not passed then "Release" is used.

    Schemes:
        XcconfigDemo


获取项目中的所有配置(包含默认配置),并输出

$ xcodebuild -showBuildSettings
$ xcodebuild -project HelloWorld.xcodeproj -target HelloWorld -configuration Debug -showBuildSettings > xcodebuild_showBuildSettings.txt

$ xcodebuild -scheme "XcconfigDemo"  -showBuildSettings  >> mynew.xcconfig  # 查看指定 scheme 的环境变量

在这里插入图片描述


4、使用环境变量

这里我将名字使用环境变量来显示

在这里插入图片描述

运行起来后,应用的名字变成了我们想要的结果。


5、使用 Pod 的项目

pod 也是使用 xcconfig 来管理配置,可以看工程中 Pods 下面的 Targets Support Files 文件夹。

引入了 pod 的项目,默认的 Configurations 为 pod 的 xcconfig;

为了不影响 pod 的使用,需要在我们的 xcconfig 的debug 和 release 中分别引入,方法如下

#include "Pods/Target Support Files/Pods-XcconfigDemo/Pods-XcconfigDemo.debug.xcconfig"

其它疑问

  • 环境变量的数据类型是什么呢?

  • 如何在代码中使用环境变量呢?

    一种写法是:

    GCC_PREPROCESSOR_DEFINITIONS = $(inherited) kHostDefault='$(kHostDefault)' kHostAlpha='$(kHostAlpha)' kHostAlphaBox='$(kHostAlphaBox)' kLIVE_SKD_APPKEY='$(kLIVE_SKD_APPKEY)' kBUGLY_ID='$(kBUGLY_ID)' kUM_CHANNEL_ID='$(kUM_CHANNEL_ID)' kUM_APPKEY='$(kUM_APPKEY)' 
    
  • 如何在 xib 的配置中使用环境变量呢?


二、语法

1、注释:

  • 没有多行注释
  • 单行注释以//开头。

2、包含语句:

  • #include 开头,后面添加文件路径。#include "Debug.xcconfig"
  • 多层路径的#include:#include "/Makefiles/CoreOS/Xcode/BSD.xcconfig"

3、变量

  • 开始以_、大写字母或者小写字母,可以含有:_0~9a~zA~Z
  • 在两个变量名或者变量与值之间使用=

4、变量分配

  • 如果想使用变量默认值,就不用在此变量的=后面添加任何值。

5、重写

// Variable set in the project file
OTHER_LDFLAGS = -ObjC

// lib.xcconfig
OTHER_LDFLAGS = -framework Security

编译时,OTHER_LDFLAGS 会是-framework Security, -ObjC 会被 -framework Security 重写。


6、继承

// Variable set in the project file
OTHER_LDFLAGS = -ObjC

// lib.xcconfig
OTHER_LDFLAGS = $(inherited) -framework Security

编译时,OTHER_LDFLAGS 会是-ObjC -framework Security


三、相关概念

workspace

workspace,顾名思义就是我们的工作区。一个workspace可以包含多个project以及一些其它文件。workspace也可以把多可以project组织起来。


project

一个 project 会包含属于这个项目的所有文件,资源,以及生成一个或者多个软件产品的信息。


target

一个project会包含一个或者多个 target,而每一个 target 都对应一个products,也就是最终产生的.app。


configuration & build settings

一个 targets 可以有多个 configuration(如我们平常用到的 debug 和 release,当然我们还可以自己添加),每个configuration 就会有对应的 build settings。每次build都是在一个configuration下build的。

build setting 中包含了 product 生成过程中所需的参数信息。project的build settings会对于整个project 中的所有targets生效,而target的build settings是重写了project的build settings,重写的配置以target为准。


scheme

那么,什么又是scheme呢?scheme就相当于一个组织者。在build的时候,schema会指定一个target和configuration,这样就能保证在build的时候configuration的唯一性,就能产生一个特定的product。


四、常见环境变量

  • $(TARGET_NAME)

目标工程名称


  • $(BUILT_PRODUCTS_DIR)

最终产品路径
build成功后的,最终产品路径--可以在Build Settings参数的Per-configuration Build Products Path项里设置


  • $(SRCROOT)

工程文件(比如Nuno.xcodeproj)的路径


  • $(CURRENT_PROJECT_VERSION)

当前工程版本号


  • $(PRODUCT_NAME)

product name,产品名字


  • $(PRODUCT_BUNDLE_IDENTIFIER)

  • Framework/Library Search Paths

表示framework和Library引用的路径,改路径是你工程下的绝对路径


  • $(SRCROOT)

工程文件目录,表示你的XXX.xcodeproj文件的目录,而你引用的framework和 Library相对xxxx.xcodeproj文件的目录就可以直接添加在$(SRCROOT)/后面了。

例如 $(SRCROOT)/Find/who.framework 表示who.framework文件是在你的工程xxxx.codeproj下的一个Find文件夹下。


  • $(EFFECTIVE_PLATFORM_NAME)

宏代表当前配置是OS还是simulator


4.一般情况下是不用特意去设置这些Search Paths的万一路径错了,就将你的framework和Library文件重新引用一遍就可以了,xcode 会自动设置这些路径的。

//以下的“=”表示右边的表达式就是左边表达式的值!


  • $(BUILD_DIR)

$(BUILD_DIR) = /Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products

表示程序编译后的路径,一般是表示在 Xcode 的 DerivedData 文件夹下编译后你的工程为xxxWorkspace-caepeadwrerdcrftijaolkkagbjf

说明:$(BUILD_DIR)是不能通过build Setting改变的,而下面的都是可以通过build Setting来改变他们的值的,以下都是默认情况下,主要是为了说明宏的意思


  • $(SDK_NAME)

$(SDK_NAME)=iphonesimulator5.0 表示获取当前SDK的名字


  • $(PLATFORM_NAME)
    = iphonesimulator 表示获取当前程序运行的平台

  • $(TARGET_NAME)

$(TARGET_NAME) = UtilLib 表示工程文件名UtiLib


  • $(EXECUTABLE_NAME)

    $(EXECUTABLE_NAME) = libUtilLib.a,表示可执行文件libUtiLib.a


  • $(ACTION)
    $(ACTION) = build表示当前操作是编译操作

  • $(CURRENTCONFIG_SIMULATOR_DIR)

表示当前模拟器路径


  • $(CURRENTCONFIG_DEVICE_DIR)

表示当前设备路径


  • ${CONFIGURATION}

表示当前状态是调试Debug还是运行状态release


  • ${CONFIGURATION}

${CONFIGURATION}-iphoneos 表示:Debug-iphoneos(如果当前模式是Debug)


  • $(BUILD_DIR)

$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME =/Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products/Debug-iphonesimulator
表示在模拟器的调试状态下


  • $(CURRENTCONFIG_DEVICE_DIR)

当然也可以自己定义路径,比如当前设备路径
$(CURRENTCONFIG_DEVICE_DIR) = ${SYMROOT}/${CONFIGURATION}-iphoneos 其中


  • ${SYMROOT}

/Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/build/products 目录


  • $(CREATING_UNIVERSAL_DIR)

$(CREATING_UNIVERSAL_DIR) = /Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products/Debug-universal


  • $(BUILT_PRODUCTS_DIR)

$(BUILT_PRODUCTS_DIR) = /Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products/Debug-iphonesimulator

表示程序编译后的目录


  • $(inherited)

Project 的 Building Settings 中的设置 默认并不被 Targets 继承,只有当Targets的设置加入了 (inherited) 时才被继承,添加目录的时候写上(inherited) 就表示从 frameworks 里面读取。

继承自更高一级的配置

-》 由到高低的配置,分别是:

Basic的Project中的配置-》此处的Target的配置-》具体的Debug还是Release的配置


五、build Settings 常见参数

  • Installation Directory:安装路径
    静态库编译时,Build Settings中Installation Directory 设置为 $(BUILT_PRODUCTS_DIR)
    Skip Install 设为YES,因为Installation Directory默认为 /usr/local/lib,Skip Install 如果是NO,可能会被安装到默认路径 /usr/local/lib
  • Public Headers Folder Path:对外公开头文件路径
    如果设为“include”(具体的头文件路径为:$(BUILT_PRODUCTS_DIR)/include/xx.h
    在最终文件.a同级目录下生成一个include目录
    默认:/usr/local/include
    Public Headers Folder Path这个路径就是使用这lib的某工程需要依赖的外部头文件.导入这路径后,#include/import “xx.h” 才能看到
  • User Header Search Paths:依赖的外部头文件搜索路径
    如果设置为 $(BUILT_PRODUCTS_DIR)/include 和2中路径对应
  • Per-configuration Build Products Path:最终文件路径
    比如设为../app,就会在工程文件.xcodeproj上一层目录下的app目录里,创建最终文件
    默认为$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
    等于 $(BUILT_PRODUCTS_DIR)
  • Per-configuration Intermediate Build Files Path:临时中间文件路径
    默认为:$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
  • Code Signing Identity:真机调试的证书选择
    选一个和Bundle identifier相对应的证书
  • Library Search Paths:库搜索路径
  • Architectures:架构,设为 armv6 或 armv7
  • Valid Architectures:应用框架,可以设为 armv6、 armv7 或i386
  • Product Name:工程文件名,默认为$(TARGET_NAME)
  • Info.plist File:info文件路径
  • Build Variants:默认为normal
  • Other Linker Flags:其他链接标签,设为-ObjC
    当导入的静态库使用了类别,需要设为 -ObjC
  • iOS Deployment Target:iOS部署对象,比如可以选择设为,ios3到ios5的一种版本
  • Prefix Header:预编头文件(比如:UtilLib/UtilLib-Prefix.pch)
  • Precompile Prefix Header:设为“Yes”,表示允许加入预编译头

六、OBJC 环境变量

变量名介绍备注
OBJC_PRINT_OPTIONSlist which options are set输出OBJC已设置的选项
OBJC_PRINT_IMAGESlog image and library names as they are loaded输出已load的image信息
OBJC_PRINT_LOAD_METHODSlog calls to class and category +load methods打印 Class 及 Category 的 + (void)load 方法的调用信息
OBJC_PRINT_INITIALIZE_METHODSlog calls to class +initialize methods打印 Class 的 + (void)initialize 的调用信息
OBJC_PRINT_RESOLVED_METHODSlog methods created by +resolveClassMethod and +resolveInstanceMethod:打印通过 +resolveClassMethod: 或 +resolveInstanceMethod: 生成的类方法
OBJC_PRINT_CLASS_SETUPlog progress of class and category setup打印 Class 及 Category 的设置过程
OBJC_PRINT_PROTOCOL_SETUPlog progress of protocol setup打印 Protocol 的设置过程
OBJC_PRINT_IVAR_SETUPlog processing of non-fragile ivars打印 Ivar 的设置过程
OBJC_PRINT_VTABLE_SETUPlog processing of class vtables打印 vtable 的设置过程
OBJC_PRINT_VTABLE_IMAGESprint vtable images showing overridden methods打印 vtable 被覆盖的方法
OBJC_PRINT_CACHE_SETUPlog processing of method caches打印方法缓存的设置过程
OBJC_PRINT_FUTURE_CLASSESlog use of future classes for toll-free bridging打印从 CFType 无缝转换到 NSObject 将要使用的类(如 CFArrayRef 到 NSArray * )
OBJC_PRINT_GClog some GC operations打印一些垃圾回收操作
OBJC_PRINT_PREOPTIMIZATIONlog preoptimization courtesy of dyld shared cache打印 dyld 共享缓存优化前的问候语
OBJC_PRINT_CXX_CTORSlog calls to C++ ctors and dtors for instance variables打印类实例中的 C++ 对象的构造与析构调用
OBJC_PRINT_EXCEPTIONSlog exception handling打印异常处理
OBJC_PRINT_EXCEPTION_THROWlog backtrace of every objc_exception_throw()打印所有异常抛出时的 Backtrace
OBJC_PRINT_ALT_HANDLERSlog processing of exception alt handlers打印 alt 操作异常处理
OBJC_PRINT_REPLACED_METHODSlog methods replaced by category implementations打印被 Category 替换的方法
OBJC_PRINT_DEPRECATION_WARNINGSwarn about calls to deprecated runtime functions打印所有过时的方法调用
OBJC_PRINT_POOL_HIGHWATERlog high-water marks for autorelease pools打印 autoreleasepool 高水位警告
OBJC_PRINT_CUSTOM_RRlog classes with un-optimized custom retain/release methods打印含有未优化的自定义 retain/release 方法的类
OBJC_PRINT_CUSTOM_AWZlog classes with un-optimized custom allocWithZone methods打印含有未优化的自定义 allocWithZone 方法的类
OBJC_PRINT_RAW_ISAlog classes that require raw pointer isa fields打印需要访问原始 isa 指针的类
OBJC_DEBUG_UNLOADwarn about poorly-behaving bundles when unloaded卸载有不良行为的 Bundle 时打印警告
OBJC_DEBUG_FRAGILE_SUPERCLASSESwarn about subclasses that may have been broken by subsequent changes to superclasses当子类可能被对父类的修改破坏时打印警告
OBJC_DEBUG_FINALIZERSwarn about classes that implement -dealloc but not -finalize警告实现了 -dealloc 却没有实现 -finalize 的类
OBJC_DEBUG_NIL_SYNCwarn about @synchronized(nil), which does no synchronization警告 @synchronized(nil) 调用,这种情况不会加锁
OBJC_DEBUG_NONFRAGILE_IVARScapriciously rearrange non-fragile ivars打印突发地重新布置 non-fragile ivars 的行为
OBJC_DEBUG_ALT_HANDLERSrecord more info about bad alt handler use记录更多的 alt 操作错误信息
OBJC_DEBUG_MISSING_POOLSwarn about autorelease with no pool in place, which may be a leak警告没有 pool 的情况下使用 autorelease,可能内存泄漏
OBJC_DEBUG_DUPLICATE_CLASSEShalt when multiple classes with the same name are present当出现类重名时停机
OBJC_USE_INTERNAL_ZONEallocate runtime data in a dedicated malloc zone在一个专用的 malloc 区分配运行时数据
OBJC_DISABLE_GCforce GC OFF, even if the executable wants it on强行关闭自动垃圾回收,即使可执行文件需要垃圾回收
OBJC_DISABLE_VTABLESdisable vtable dispatch关闭 vtable 分发
OBJC_DISABLE_PREOPTIMIZATIONdisable preoptimization courtesy of dyld shared cache关闭 dyld 共享缓存优化前的问候语
OBJC_DISABLE_TAGGED_POINTERSdisable tagged pointer optimization of NSNumber et al.关闭 NSNumber 等的 tagged pointer 优化
OBJC_DISABLE_NONPOINTER_ISAdisable non-pointer isa fields关闭 non-pointer isa 字段的访问

参考

  • xcode的环境变量,Build Settings参数,workspace及联编设置
    https://blog.csdn.net/itianyi/article/details/23852133
  • 陈兴Startry:iOS开发必备–环境变量配置(Debug & Release)
    http://www.cocoachina.com/articles/13869
  • The Unofficial Guide to xcconfig files
    https://pewpewthespells.com/blog/xcconfig_guide.html
    https://www.jianshu.com/p/aad1f9e72382
    http://www.cocoachina.com/ios/20141225/10761.html

伊织 2020-02-24

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

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

相关文章

C语言之“可变参数<stdarg.h>”

目录 前言 stdarg.h头文件 实例:遍历并求和所有传递给sum函数的额外实际参数 前言 有时我们会希望函数带有可变数量的参数就像printf(cosnt char* format ...)和scanf(cosnt char* format ...)那样除了有一个参数 …

ArkTS-文本滑动选择器弹窗

文本滑动选择器弹窗 根据指定的选择范围创建文本选择器,展示在弹窗上。 示例 Entry Component struct TextPickerDialogExample {State select: number 2private fruits: string[] [苹果, 香蕉, 橘子, 梨儿, 桃儿]build() {Row() {Column() {Text(当前选择为&…

windows系统bat脚本命令总结之reg命令

前言 做了一段时间的bat脚本开发,bat脚本中有各种各样的命令跟传统的编程逻辑完全不同,本专栏会讲解下各种各式的命令使用方法。 本篇文章讲解的是windows系统注册表操作命令"reg"。 reg命令简介 “reg” 是 Windows 操作系统中的一个命令行工…

关于前端学习的思考-浮动元素和块级元素的关系

先摆关系:浮动元素嵌套块级元素,浮动元素和块级元素是上下关系。 1、浮动元素为父盒子,块级元素为子盒子。 父盒子为浮动元素,子盒子不会继承。如图floatnone; 摆结论:子盒子为行内元素,行内块…

智能优化算法应用:基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.群居蜘蛛算法4.实验参数设定5.算法结果6.参考…

excel 计算断面水质等级

在工作中遇到根据水质监测结果要判断断面等级。写了下面的公式: 因子标准值 limits {COD: [15,15, 20, 15,20],氨氮: [0.15, 0.5, 1, 1.5, 2.0],总磷: [0.02, 0.1, 0.2, 0.3, 0.4] } excel公式: IFS(MAX(IF(M2>20,1,0), IF(N2>2,1,0), IF(O2&g…

夜莺项目发布 v6.4.0 版本,新增全局宏变量功能

大家好,夜莺项目发布 v6.4.0 版本,新增全局宏变量功能,本文为大家简要介绍一下相关更新内容。 全局宏变量功能 像 SMTP 的配置中密码类型的信息,之前都是以明文的方式在页面展示,夜莺支持全局宏变量之后,可…

SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel | 京东云技术团队

前言:作者查阅了Sentinel官网、51CTO、CSDN、码农家园、博客园等很多技术文章都没有很准确的springmvc集成Sentinel的示例,因此整理了本文,主要介绍SpringMvc集成Sentinel SpringMvc集成Sentinel 一、Sentinel 介绍 随着微服务的流行&…

SpringBoot Bean解析

Bean解析 IOC介绍 松耦合灵活性可维护 注解方式配置Bean 实现方式1: Component声明,直接类上进行添加注解, 同时保证包扫描能扫到即可实现方式2: 配置类中使用Bean Configuration public class BeanConfiguration implements SuperConfiguration{Bean("dog")Ani…

【开源】基于JAVA的大学计算机课程管理平台

项目编号: S 028 ,文末获取源码。 \color{red}{项目编号:S028,文末获取源码。} 项目编号:S028,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2…

AtCoder Beginner Contest 330 A~F

A.Counting Passes(暴力) 题意&#xff1a; 给定 n n n个学生的分数&#xff0c;以及及格分 x x x &#xff0c;问多少人及格了。 分析&#xff1a; 暴力枚举&#xff0c;依次判断每个学生的分数即可。 代码&#xff1a; #include <bits/stdc.h> using namespace s…

Stability AI 新发布SDXL Turbo:一款实时文本到图像生成模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Word异常退出文档找回怎么操作?4个正确恢复方法!

“刚刚我在用word编辑文档&#xff0c;但是突然word就显示异常了&#xff0c;然后莫名其妙就自动退出了&#xff0c;这可怎么办&#xff1f;我还有机会找回这些文档吗&#xff1f;” 当我们在使用Microsoft Word时&#xff0c;突然遭遇到程序异常退出的情况&#xff0c;可能会让…

四个方法,设置excel文件只读模式

由于excel文件经常用于数据文件&#xff0c;数据就需要特别保护&#xff0c;大家可能需要将文件设置为只读模式来保护数据不被修改&#xff0c;Excel文件想要设置为只读的方法有很多&#xff0c;今天分享四种方法给大家&#xff1a; 方法一&#xff1a;文件属性 右键点击文件…

面试篇之微服务(一)

目录 概览 1.什么是微服务&#xff1f; 2.微服务带来了哪些挑战&#xff1f; 3.现在有哪些流行的微服务解决方案&#xff1f; 这三种方案有什么区别吗&#xff1f; 4.说下微服务有哪些组件&#xff1f; 注册中心 5.注册中心是用来干什么的&#xff1f; 6.SpringCloud可…

Android Studio Giraffe-2022.3.1-Patch-3安装注意事项

准备工作&#xff1a; android studio下载地址&#xff1a;https://developer.android.google.cn/studio/releases?hlzh-cn gradle下载地址&#xff1a;https://services.gradle.org/distributions/ 比较稳定的网络环境&#xff08;比较android studio相关的依赖需要从谷歌那边…

spring cloud Eureka注册中心和Nacos注册中心

文章目录 Eureka注册中心.Eureka的结构和作用搭建eureka-server创建 服务引入eureka依赖编写启动类编写配置文件启动服务 服务注册1&#xff09;引入依赖2&#xff09;配置文件3&#xff09;启动多个user-service实例 服务发现1&#xff09;引入依赖2&#xff09;配置文件3&…

日本MF备案注册数据库-在线免费查询

在日本&#xff0c;药物主文件&#xff08;DMF&#xff09;称为“主文件”或“MF”。 药物主文件&#xff08;DMF&#xff09;系统允许活性药物成分&#xff08;API&#xff09;的制造商向日本审查机构&#xff08;PMDA&#xff09;提交API的详细信息&#xff08;制造方法、数…

免费的电脑AI写作工具-5款好用的智能AI写作软件

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;电脑AI写作已经成为现代写作领域的一项不可或缺的工具。通过深度学习和自然语言处理的融合&#xff0c;AI写作软件得以模拟人类的创造性和表达能力&#xff0c;为我们提供了快速、高效地生成优质文字内容的可…

硫酸钡行业分析:预计2028年将达到8.3亿美元

硫酸钡常用于消化道造影&#xff0c;据国内使用者报道&#xff0c;粗细不匀型硫酸钡&#xff0c;优于细而匀的硫酸钡。硫酸钡是一种用于白色颜料、纸张、橡胶、X光检查时使用的填充剂。具有低硬度、接近直角交叉的完全解理、高密度、遇盐酸不起泡沫的板状结晶&#xff0c;与类似…