有了Makefile, CMake存在的意义是什么?如何借助Makefile构建ObjC语言编译环境?如何获取编译器的版本号?

有了Makefile, CMake存在的意义是什么?

Makefile规定了编译脚本的基本长相,但随着跨平台需求越来越大,一份Makefile想要跨平台给Windows/Linux/Mac等等平台越来越难,需要维护的工作量越来越大。CMake定义了makefile中跨平台需要的公用组成,使用更简洁的语法,方便了维护。

如何借助Makefile构建ObjC语言编译环境?

除了在线ObjC编译器,本地环境Windows/Mac/Linux均可以搭建ObjC编译环境。

  • Mac自然不用多说,ObjC是亲儿子。
  • (WSL Ubuntu 22.04) Ubuntu可以安装gobjc/gnustep和gnustep-devel构建编译环境。
    sudo apt-get install gobjc gnustep gnustep-devel

    注意Clang一样可以编译ObjC,但Clang本身不包含ObjC最基本的头文件和库,需要单独下载,需上面的安装命令完成此环境配置。

    编译方法1:可以使用官方懒人版bash /usr/share/GNUstep/Makefiles/GNUstep.sh并写一个objc编译
    的makefile,用make命令搞定。
    编译方法2:利用gnustep-config --objc-flags和gnustep-config --objc-libs获取objc编译选项,并在编译时带入(注意,需额外增加-lgunstep-base)。例如:
    gcc demo.m -MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 -DGNU_GUI_LIBRARY=1 -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fexceptions -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -pthread -fPIC -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -g -O2 -fconstant-string-class=NSConstantString -I. -I/home/cx/GNUstep/Library/Headers -I/usr/local/include/GNUstep -I/usr/include/GNUstep -shared-libgcc -pthread -fexceptions -rdynamic -L/home/cx/GNUstep/Library/Libraries -L/usr/local/lib -L/usr/lib -lobjc -lm -lgnustep-base -o demo

    如用Clang编译,会遇到"objc/objc.h file not found"的错误,相比上面的GCC命令,需要多加一个头文件路径的参数参数:-I/usr/lib/gcc/x86_64-linux-gnu/11/include,当然也可以手动构造软链接sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/11/include/objc /usr/local/include/objc来解决。
  • (Windows 10) Windows可以下载gnustep可执行包,和上面Ubuntu的gnustep类似,只不过是Windows版本,自然只支持ObjC 1.0,不支持2.0.
    Index of /pub/gnustep/binaries/windows/
    GNUSTEP developer guide可参考官方文档:GNUstep: Documentation,也可以自己组装编译命令,例如:
    H:\tools\GNUstep\bin\gcc.exe demo.m -I H:/tools/GNUstep/GNUstep/System/Library/Headers -L H:/tools/GNUstep/GNUstep/System/Library/Libraries -std=c99 -lobjc -lgnustep-base -fconstant-string-class=NSConstantString

如何获取编译器的版本号?

C语言标准规定了不同版本的代号,但编译器自身的版本和C标准版本不是一个概念,C标准也不会为编译器规定版本号,这是厂商决定的。虽然通过命令行--version选项或者cl /?可以获取版本号,这不能在代码中判断,如下介绍一些编译器定义的版本宏。

  • MSVC
    _MSC_VER宏
  • GCC/MinGW/Cygwin
    __GNUC__: 主版本号。
    __GNUC_MINOR__: 次版本号。
    __GNUC_PATCHLEVEL__: 补丁级别。
  • clang
    __clang_major__: 主版本号。
    __clang_minor__: 次版本号。
    __clang_patchlevel__: 补丁级别。

CMake中可利用CMAKE_CXX_COMPILER_VERSION变量获取编译器版本。


若文章对您有帮助,欢迎关注。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

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

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

相关文章

x-cmd pkg | howdoi - 无需打开浏览器,轻松搜索编程问题的解决方案

目录 简介首次用户技术特点竞品和相关项目进一步阅读 简介 howdoi 一个在终端中查找编程问题的命令行工具和 python 库,可用于从 Stack Overflow 等编程社区获取搜索问题的答案,并将它们以代码片段的形式显示在命令行中。 首次用户 本文提供了一个dem…

实测运行容器化Tomcat服务器

文章目录 前言一、拉取Tomcat 9.0镜像二、运行容器化Tomcat服务器三、访问Tomcat官网首页测试 总结 前言 运行容器化Tomcat服务器,首先确保正确安装docker,并且已启动运行,具体安装docker方法见笔者前面的博文《OpenEuler 下 Docker 安装、配…

Enhanced Table如何安装?

githup项目地址: https://github.com/fbaligand/kibana-enhanced-table/releases/tag/v1.12.0

R门 - rust第一课陈天 -内存知识学习笔记

内存 #mermaid-svg-1NFTUW33mcI2cBGB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1NFTUW33mcI2cBGB .error-icon{fill:#552222;}#mermaid-svg-1NFTUW33mcI2cBGB .error-text{fill:#552222;stroke:#552222;}#merm…

品融电商:新形势下电商平台如何助力品牌长期经营

品融电商:新形势下电商平台如何助力品牌长期经营 在过去几年中,随着内容电商的兴起,一批新兴品牌通过精准的内容种草和互动营销迅速打开市场,实现了从“0到1”的品牌起步阶段。比如,新品牌SIINSIIN通过小红书等内容电商…

C语言中操作符详解(下)

C语言中操作符详解_下 放在最前面的1、条件操作符(三目操作符)1.1、定义1.2、举例分析:(上代码)输出结果:代码的解释: 2、逗号表达式2.1、定义2.2、举例分析:(上代码&…

渐进式JavaScript框架Vue 3 入门

目录 前言1. Vue 3 的基础入门1.1 什么是 Vue.js1.2 局部使用 Vue 2. Vue 3 的基本配置2.1 准备 HTML 页面并引入 Vue 模块2.2 创建 Vue 应用实例 3. Vue 的数据绑定与界面渲染3.1 插值表达式 4. 常用指令详解4.1 v-for 指令:列表渲染4.2 v-bind 指令:绑…

LeetCode105.从前序与中序遍历构造二叉树

题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 提示: 1 < preorder.length < 3000inorder.length preorder.length-3000 < pr…

css-50 Projects in 50 Days(3)

html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>旋转页面</title><link rel"sty…

基于STM32单片机多路无线射频抢答器

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、资料内容 前言 随着科技的不断进步和各类竞赛活动的日益增多&#xff0c;抢答器作为一种重要的竞…

【Linux】多线程(中)

目录 一、线程互斥 1.1 互斥概念 1.2 互斥量mutex 1.3 互斥量相关API &#xff08;1&#xff09;初始化互斥量 &#xff08;2&#xff09;销毁互斥量 &#xff08;3&#xff09;互斥量加锁和解锁 1.4 互斥量原理 1.5 重入和线程安全 二、死锁 2.1 概念 2.2 造成死锁…

光控资本:什么是庄家洗盘和出货?各有什么特征?

什么是庄家洗盘和出货&#xff1f; 庄家洗盘&#xff1a;庄家洗盘是指庄家使用其筹码优势来作出一些K线图形&#xff0c;进而引起市场上的散户投资者的惊惧&#xff0c;然后洗掉散户手中的起浮筹码&#xff0c;使盘面更加安稳&#xff0c;减轻股票后期拉升压力的行为。 庄家洗…

【Vue3】知识汇总,附详细定义和源码详解,后续出微信小程序项目(5)

快速跳转&#xff1a; 我的个人博客主页&#x1f449;&#xff1a;Reuuse博客 新开专栏&#x1f449;&#xff1a;Vue3专栏 参考文献&#x1f449;&#xff1a;uniapp官网 免费图标&#x1f449;&#xff1a;阿里巴巴矢量图标库 ❀ 感谢支持&#xff01;☀ 前情提要 &#x…

5ire:开源AI工具的新纪元

抖知书老师推荐&#xff1a; 在AI技术飞速发展的今天&#xff0c;5ire作为一款开源的AI工具&#xff0c;已经悄然改变了我们对传统AI工具的认知。那些曾对AI技术抱有疑虑的人们&#xff0c;现在可以更加自信地拥抱这一变革。原本担心工作会被AI取代的忧虑逐渐平息&#xff0c;…

Unity图形学之Shader2.0矩阵变换

1.将物体坐标系 变换 到世界坐标系&#xff1a; Unity3D里面矩阵是左乘的 P(世界) M(物体到世界的变换矩阵) * P(物体) 规律&#xff1a;3D变换 首先将物体坐标系变换到世界 2.将 世界坐标 变换 到相机坐标 P(相机) M(世界到相机的变换矩阵) * P(世界) using System.Col…

网上商城系统设计与Spring Boot框架

3 系统分析 当用户确定开发一款程序时&#xff0c;是需要遵循下面的顺序进行工作&#xff0c;概括为&#xff1a;系统分析–>系统设计–>系统开发–>系统测试&#xff0c;无论这个过程是否有变更或者迭代&#xff0c;都是按照这样的顺序开展工作的。系统分析就是分析系…

JavaWeb-JSP

可以写java代码也前端代码 jsp本来就是Serclet jsp脚本 EL表达式 要将jsp获取的东西放到域中 转发到/el-demo.jsp中 jsp中用&#xffe5;{}获取域中的信息 JSTL标签 c&#xff1a;if标签 jsp中 c:forEach标签 MVC 查询所有 在service层实现 Servlet代码&#xff1a;1.创建Br…

Area-Composition模型部署指南

一、介绍 本模型可以通过输入不同的提示词&#xff0c;然后根据各部分提示词进行融合生成图片。如下图&#xff1a; 此图像包含 4 个不同的区域&#xff1a;夜晚、傍晚、白天、早晨 二、部署 环境要求&#xff1a; 最低显存&#xff1a;10G 1. 部署ComfyUI 本篇的模型部署…

经典文献阅读之--DROID-SLAM(完美的深度学习slam框架)

0. 简介 深度学习和SLAM现在结合越来越紧密了&#xff0c;但是实际上很多时候深度学习只会作为一个block放在slam系统中。而很多深度学习slam算法&#xff0c;在slam这边的性能都不是太好&#xff0c;尤其是回环和全局优化这块。因为有一些深度学习的工作就不太适合做回环检测…

【windows 下使用 tree】

windows git bash 下使用 tree 下载tree二进制文件 https://gnuwin32.sourceforge.net/packages/tree.htm 解压缩找到 tree.exe 扔进git bash的命令目录 C:\Program Files\Git\usr\bin 打开测试