Mac OSX创建动态链接库

2023-11-16

Windows——.DLL; Linux——.so;Mac OS X—— .dylib; .dylib是Mach-O格式,也就是Mac OS X下的二进制文件格式。Mac OS X提供了一系列 工具,用于创建和访问动态链接库。
编译器/usr/bin/cc,也就是gcc了,Apple改过的。这个主要还是一个壳,去调用其他 的一些部件。当然同时还有/usr/bin/c++,等等。
汇编器/usr/bin/as
链接器/usr/bin/ld

Mac OS X有个自己的工具,/usr/bin/libtool,来创建动态链接库。这个libtool不是 GNU的那个同名的libtool。我记得GNU libtool可以Fink(http://fink.sf.net)下 载,编译后得到glibtool。

创建动态链接库:
1、生成module文件,也就是.o文件。这跟一般的Linux没什么区别。
cc -c a.c b.c  就得到a.o和b.o
2、用ld来合并.o文件
ld -r -o c.o a.o b.o  这个也没什么特别。
3、用libtool来创建动态链接库。
libtool -dynamic -o c.dylib a.o b.o  ( 这里也可以用libtool -static -o c.a a.o b.o就创建静态库)

如果用gcc直接编译,linux下一般是:
gcc -shared -o c.so a.c b.c
而在Mac OS X下需要:
gcc -dynamiclib -o c.dylib a.c b.c

这往往也是向Mac OS X移植unix程序常出问题的地方。如果用autoconf/automake等 工具,出错的几率应该小一些。

访问动态链接库:
1、nm是最常用的,这个用法跟linux下差不多
nm c.dylib  可以看到导出符号表,等等。
2、另一个常用的工具是otool,这个是Mac OS X独有的。比如想看看c.dylib的依赖关系
otool -L c.dylib

对Framework的理解:

Framework是Mac OS X下必不可少的部分,不妨去看看/System/Library/Frameworks/下面,一大堆Framework。Framework是dylib的进一步演化,它把头文件、文档、动态链接库等整合成一个有机的目录,类似一种自描述的方式,这种做法其实在Mac OS X下随处可见。比如应用程序,一般都是一个目录,譬如/Applications/iTunes.app目录对应应用程序iTunes,双击这个目录即开始执行。这种做法和Windows下常见的一个exe/dll打天下很不相同。

Framework的创建工具也是libtool,详细用法参考man。


//

这里介绍一下怎么开发最简单的Cocoa程序,这个程序实在是太简单,因为如果你用Xcode的话,选用Cocoa Foundation Command Tool的话,应该不用写任何代码, 但是这里是为了向大家介绍一下,这个最简单的程序是如何通过gcc编译成功的,当然里面还有一个东西可以做一点解释. 
 
先看看源代码: 
#import <Foundation/Foundation.h> 
 
int main(int argc, char* argv[]) 
{ 
    NSLog(@"Hello Cocoa From Console"); 
    return 0; 
} 
代码很简单,你可以用你喜欢的任何文本编辑工具来完成它, 源码文件名为hello.m, 这样简单的一个程序用xcode的话就太奢侈了. 
ok,下面来看看怎么编译这个程序, 打开终端, cd 到源文件所在的目录,然后执行下面的这个命令,就可以生成一个叫做hello的程序了. 
gcc -framework Foundation hello.m -o hello 
这里面需要解释的是 -framework 参数, 熟悉gcc的朋友可能知道,gcc中的-l参数其实是传递给ld命令的,是用于链接器工作的, mac下面的-framework和-l参数的效果是一样的,就是告诉ld编译后的目标文件在生成最终的执行文件的时候,要连接哪个framework, 因为mac的核心Darwin也是一个unix,所以在Mac下面-l参数也是被支持的.  
另外还有一点, gcc还可以接受-L来指定要连接的library在什么位置,这个选项一般用来连接第三方的库, 那么如果我想连接第三方的Framework的时候,我应该怎么做呢? -L /your/Framework? 不对, gcc针对这种情况使用了另外一个参数 -F, 所以如果你要连接第三方的framework, 比如/opt/Qt4/QtCore, 你应该像下面这样使用gcc.  
gcc -F/opt/Qt4 -framework QtCore qttest.cpp -o qttest 
 
好了,现在继续来解释上面那个程序里面的另一个问题,为什么字符串的前面多了个@符号呢?想必这个东西也困扰了不少人, 在obj-c里面@"string"这种模式在编译的时候会被编译器进行一个转换,生成一个NSString指针的实例,所以在需要NSString指针作为参数的地方,如果你不想明确的构造这个NSString指针, 那么用这种方法就最简单了,但是如果你将@"String"模式用在了需要c string的地方,就要出现错误了。

Note:

因为obj-c都是用指针操作的,用"字符串"这样表示的c string,明显compiler是不知道这个"字符串"的地址应该放在在哪里。前面加个at,那么@"字符串"的意思基本上是new一个叫做"字符串"的NSString,并且返回这个NSString的地址。 
所以 
 
NSLog("Hello Cocoa From Console"); 
这样就会出错, 
NSLog(@"Hello Cocoa From Console"); 
这样就没问题。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mac OSX创建动态链接库 的相关文章

  • 如何在Linux中为特定程序设置进程ID

    我想知道是否有某种方法可以在运行某些应用程序之前强制使用 Linux 的某些特定进程 ID 我需要提前知道进程ID 实际上 有一种方法可以做到这一点 自内核 3 3 设置了 CONFIG CHECKPOINT RESTORE 在大多数发行版
  • 在C中获取终端宽度?

    我一直在寻找一种从 C 程序中获取终端宽度的方法 我不断想出的是这样的东西 include
  • 如何在 Linux 中检测通过 GUI 登录的用户

    我想在我的程序中捕获通过 GUI 登录的用户名 我的程序作为守护进程从 root 登录运行 如果非 root 用户通过 GUI 登录 我的程序应该会收到通知 我正在粘贴我当前的程序 该程序调用一个 perl 脚本 利用系统调用来检查当前登录
  • Windows批量编程中读取文件名

    我想在Windows批处理编程中读取文件的名称 我尝试使用不同的方法但失败了请帮助 下面给出了场景 我的文件夹中有不同的文件 但所有文件的文件名长度相同 例如 1000342578 30062011 PDF 1000342329 30062
  • Linux下对多个文件进行排序

    我有多个 很多 文件 每个都非常大 file0 txt file1 txt file2 txt 我不想将它们合并到一个文件中 因为生成的文件将超过 10 场演出 每个文件中的每一行都包含一个 40 字节的字符串 现在字符串的排序相当好 大约
  • 编译错误:linux/module.h:没有这样的文件或目录

    我写了一个简单的模块 define KERNEL define MODULE include
  • 通过 C 将线程固定到 cpuset 中的核心

    我有 cgroup cpuset set1 set1有2 5 8 我想将一个进程绑定到该 cpuset 然后将该进程中的一个线程固定到核心 4 cpuset 的名称 线程名称以及我应该将线程绑定到的核心位于 m 配置文件中 是否有任何 C
  • 如何以编程方式重新启动 Windows 资源管理器进程

    我正在开发 Windows shell 扩展 不幸的是 在更改 DLL 时 我必须重新启动 Windows 资源管理器 因为它将 DLL 保留在内存中 我从 Dino Esposito 找到了这个程序 但它对我不起作用 void SHShe
  • 当我启动程序时,Arduino IDE (Win10) 崩溃

    我的 Arduino IDE Win10 上的版本为 1 8 12 在启动时崩溃 运行arduino debug exe我收到此错误消息 C Program Files x86 Arduino gt arduino debug exe Se
  • 在 Windows 上使用 Python 打开设备句柄

    我正在尝试使用 Giveio sys 驱动程序 该驱动程序需要先打开一个 文件 然后才能访问受保护的内存 我正在查看 WinAVR AVRdude 中的 C 示例 它使用以下语法 define DRIVERNAME giveio HANDL
  • 如何从 Emacs 中运行 Cygwin Bash Shell?

    我在 Windows 上运行 GNU Emacs 因此输入 M x shell 启动 Windows 命令行 DOS shell 但是 我希望能够从 Emacs 中运行 Cygwin Bash Shell 或任何其他非 Windows sh
  • 在 docker windows 上运行 linux 容器

    我在 Windows 10 机器上安装了 Docker for Windows 它要求我启用 HyperV 功能 一切都安装正确并且运行良好 虽然有一件事让我大吃一惊 我实际上能够在 docker windows 上运行 Linux 容器
  • 为什么我的 Linux 应用程序引入了错误的 .so 库?

    我正在构建一个使用 NetCDF C 库的应用程序 并且 NetCDF 正在引入 HDF 4 库 然而 它正在拉动wrongHDF 4 库 我的应用程序的链接方式如下 apps1 intel bin icpc gxx name apps1
  • 即使退出命令后,Shell 脚本仍继续运行

    我的shell脚本如下所示 bin bash Make sure only root can run our script EUID ne 0 echo This script must be run as root 1 gt 2 exit
  • Shell 执行将窗口置于前面

    我正在使用此函数从我的 MSI 调用可执行文件 然而 可执行文件的窗口隐藏在我的 MSI 窗口后面 有什么办法可以把它带到前面吗 我尝试在调用之前最小化所有窗口ShellExecute但这仍然没有将可执行窗口带到前面 extern C UI
  • 打印堆栈指针的值

    如何在 Linux Debian 和 Ubuntu 中用 C 打印堆栈指针的当前值 我尝试谷歌但没有找到结果 一个技巧是简单地将本地地址作为指针打印出来 但它不可移植 甚至无法保证有效 void print stack pointer vo
  • 如果specfile中的某些条件不满足,如何中止rpm包的安装?

    还有一些事情Requires标签不满足 所以我写了一个脚本来验证这些东西 但是我把它们放在哪里呢 如果没有找到 那么我想退出安装 提示用户在尝试再次安装此 rpm 之前执行这些步骤 writing exit 1 in installtag
  • 识别 Windows 版本

    我正在编写一个打印出详细 Windows 版本信息的函数 输出可能是这样的元组 32bit XP Professional SP3 English 它将支持 Windows XP 及更高版本 我一直坚持获取 Windows 版本 例如 专业
  • /etc/php5/conf.d 文件夹中的 .ini 文件有什么用?

    我知道 ini 文件位于 etc php5 cli与 PHP 的 CLI 使用有关 文件位于 etc php5 fpm是关于 PHP 的 FastCGI FPM 方面 但是位于以下位置的 ini 文件又如何呢 etc php5 conf d
  • 使用Linux虚拟鼠标驱动

    我正在尝试实施一个虚拟鼠标驱动程序根据基本 Linux 设备驱动程序书 有一个用户空间应用程序 它生成坐标以及内核模块 See 虚拟鼠标驱动程序和用户空间应用程序代码 http www embeddedlinux org cn Essent

随机推荐

  • 数据分析报告概述

    一 结构规范及写作 报告常用结构 1 架构清晰 主次分明 数据分析报告要有一个清晰的架构 层次分明能降低阅读成本 有助于信息的传达 虽然不同类型的分析报告有其适用的呈现方式 但总的来说作为议论文的一种 大部分的分析报告还是适用总 分 总 的
  • 拜占庭将军问题 原文翻译

    拜占庭将军问 作者 LESLIE LAMPORT ROBERT SHOSTAK 和 MARSHALL PEASE 斯坦福国际研究院 译者 校对 闵敏 裴奇 Elisa EthFans org 可靠的计算机系统必须具备处理故障组件的能力 以防
  • nginx反向代理ipv6网站,使其可被ipv4访问

    环境 ubuntu 18 04 1 主机本身ipv6 v4双栈 0 安装nginx sudo apt get install nginx 1 编辑nginx conf sudo vi etc nginx nginx conf 在http 段
  • 镜像下载boot.iso和dvd1.iso的区别;dnf:找不到命令;yum和dnf的区别;CentOS Stream和Linux的区别;dnf: command not found

    这里写目录标题 一 linux 的各个系列 二 End dates are coming in 2024 for CentOS Stream 8 and CentOS Linux 7 三 镜像下载boot iso和dvd1 iso的区别 四
  • [USB 3.0 报错]-高手必看!BIOS 设置中的 xHCI 模式以及 USB 2.0/3.0 的万能 Windows 驱动

    目录 关于 USB 3 0 报错符合 USB xHCI 的主机控制器 错误代码为 10 一个匪夷所思的 USB 3 0 问题 这种情况会导致哪些症状呢 破案了 这个困扰我大半年的问题其实是 intel xHCI 模式的设置问题 初识 xHC
  • 跳转控制语句

    跳转控制语句 continue 用在循环中 基于条件控制 跳过某次循环体内容的执行 继续下一次的执行 break 用在循环中 基于条件控制 终止循环体内容的执行 也就是说结束当前的整个循环 实例 public class ControlDe
  • 新手怎么做期货?一文让你找到方向

    改革开放40年以来 我国经济水平发展逐年上升 人均收入逐年增长 金融衍生品交易市场也随之逐渐繁荣 越来越多的投资者开始走进期货投资市场 其中不乏有新手不知道怎么炒期货 第一 首先要做的功课是了解自己的个性 做期货不是光靠技术 如果成功按10
  • 使用nps内网穿透的问题记录

    实现目标 将局部网 可访问互联网 设备的端口映射到公网服务器上 1 资料准备 下载nps server 和npc client 安装包 https github com ehang io nps releases 文档 https ehan
  • SpringCloud-消息驱动

    消息驱动 Spring Cloud Stream 概述 常见MQ 消息中间件 ActiveMQ RabbitMQ RocketMQ Kafka 有没有一种新的技术诞生 让我们不再关注具体MQ的细节 我们只需要用一种适配绑定的方式 自动的给我
  • 高并发模拟~多个线程同时发起请求

    高并发模拟 多个线程同时发起请求 两种方案 CyclicBarrier 栅栏 所有的线程必须同时到达栅栏位置 才能继续执行 CountDownLatch 计数器 一个线程或多个线程一直等待 直到其他线程执行的操作完成 1 CyclicBar
  • 【Mo&AI TIME 人工智能技术博客】矛与盾的对决——神经网络后门攻防

    本篇文章内容转载于 AI TIME论道 公众号 秉持着合作共享的信念 希望给热爱人工智能的你们 提供更全面 前沿的人工智能和学科发展资讯 2022年7月9日 AI TIME组织了Ph D Debate第十一期 题为 矛与盾的对决 神经网络后
  • Spring framework testing文档读书笔记

    该文章是我读Spring testing英文官方文档的读书笔记 方便以后快速的回忆文档里讲述的内容 而不用再去读一遍官方文档 文章内容精简掉了官方文档的一些比较浅显易懂的用法以及一些很细节的地方 一半是翻译 然后加入部分自己的理解 可以使读
  • 树莓派Linux内核替换

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 准备工作 二 修改配置文件 配置config 编译 打包 数据拷贝 将SD卡转插到树莓派 一 准备工作 安装好对应交叉编译工具 将需要替换的Linux拷进Ubu
  • python docx处理word文档中表格合并问题

    问题描述 python中用docx库读取word文件 若word文件中包含合并的表格表格 则通过docx读取显示 file docx Document path for table in file tables for row in tab
  • KVM上如何绑定虚拟机vcpu与物理CPU?

    Taskset命令设置某虚拟机在某个固定cpu上运行 1 设置某个进程pid在某个cpu上运行 root test taskset p000000000000000000000000000000000000100 95090 pid 950
  • 多节点高可用Eureka集群与服务注册

    0 多节点 找多借点配置的直接从最下面这里开始看 修改消费者和提供者的application yml文件 defaultZone http peer1 8761 eureka http peer2 8762 eureka 1 简介 Eure
  • list 去重方式

    List
  • 大专学历走社招,两个部门,六轮面试,终与字节无缘

    这个面试机会来的挺意外的 先在 Boss 投递的简历 后再某客网看到了内推人的微信 加了微信问了下进度 挂了 内推人给我打电话根据简历简单询问了一下情况 内推人很谦逊 毕业于一所 211 大学 和我说他的学历也很一般 然后和 hr 沟通捞了
  • IntelliJ IDEA运行JAVA

    1 安装软件 这边需要你先安装IntelliJ IDEA和java sdk 检查是否安装java sdk IntelliJ IDEA安装软件链接 https www jetbrains com idea download section w
  • Mac OSX创建动态链接库

    Windows DLL Linux so Mac OS X dylib dylib是Mach O格式 也就是Mac OS X下的二进制文件格式 Mac OS X提供了一系列 工具 用于创建和访问动态链接库 编译器 usr bin cc 也就