问题标签 [darwin]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
7996 浏览

c++ - 共享库或 dylib 中未定义符号的处理方式是什么?

我有一个用于 linux 的 Makefile,我将其移植到 Darwin。makefile 需要一堆 .o 文件并将它们链接在一起成为一个 .so 共享对象。好的,所以我想(我错了吗?)达尔文最好的模拟是 dylib。所以我将 -shared 标志更改为 -dynamiclib。

现在,我链接到 dylib 中的代码依赖于许多外部库。当我尝试构建 dylib 时,我收到错误消息,提示存在未定义的引用。但是 Linux Makefile 没有在创建 .so 文件的构建步骤中指定任何 -lwhatever 或 -L/path/whatever 选项。嗯?这是因为当您创建 ELF .so 文件时,默认情况下它会保留未解析的外部引用,然后在加载共享库时,它会递归加载您正在加载的共享库所依赖的共享库?如果共享库依赖于 .a 或 .o 文件,您是否必须将它们静态链接到共享库中,否则您无法在运行时链接?你怎么能摆脱在运行时加载的库中有未定义的引用,除非引用也是动态加载的库?

无论如何,如果我指定

它不需要我在创建共享库时添加那些 -l 和 -L 选项。但我仍然不明白这最终如何运作。

0 投票
1 回答
137 浏览

c - 检查 C 中是否存在外部定义的标识符

我在开发 iOS 的 Objective-C 时遇到了这个问题,但这应该适用于使用 Mac OS X/iOS 链接器的任何 C/C++/Objective-C 代码。另一个问题涵盖了该解决方案,但我对为什么感兴趣。

假设我正在使用指向定义常量的库的链接。在头文件中有这样的声明:

我想编译我的应用程序并在具有早期版本库的系统上运行它,其中该常量没有定义,因此为了安全起见,我不认为它已被定义。

现在,如果有一个仅在最新版本的库中定义的函数,我可以这样做:

不包含函数代码的地址,而是BrandNewFunc计算为 NULL。我认为常量的行为方式相同,但如果我尝试相同的模式,应用程序会在执行检查时死掉(在 iOS 上抛出 EXC_BAD_ACCESS)。具体来说:

取而代之的是检查标识符的地址:

我可以看到逻辑:BrandNewIdentifier没有价值,所以访问它应该失败。但是,为什么该语法在 的情况下有效BrandNewFunc?我不应该也需要检查它的地址吗?还是它实际上是一致的,并且我忽略了一些东西?

0 投票
3 回答
7728 浏览

c - Darwin下如何开启大文件支持?

我有一个 C 应用程序,我正在尝试为 Mac OS X 10.6.4 编译:

gcc的如下:

Makefile的如下:

问题是我的应用程序调用fseeko64and fopen64,并使用该off64_t类型进行偏移。当我编译我的应用程序时,我收到以下警告和错误:

我的代码在 Linux 下构建没有错误。在 Darwin 下构建时,我可以对源代码进行哪些更改以添加大文件支持?

0 投票
1 回答
821 浏览

iphone - 获取设备内存 Xcode

我真的需要知道一种获取当前设备的方法:

  1. 主动记忆
  2. 非活动内存
  3. 有线内存
  4. 空闲内存
  5. 总内存

任何信息、代码或任何东西都是有帮助的。

提前致谢。

0 投票
2 回答
3330 浏览

iphone - ARM Darwin 程序集——寻找系统调用(也许是教程)

所以我开始了汇编编程。这在我的 Ubuntu 机器上非常简单:使用 NASMamd GNU ld,我能够在半小时内编写或多或少复杂的 HelloWorld 风格的程序。但是当谈到 iPhone 时,它​​是如此复杂。首先,我有一个JB'en iPhone 3G on 4.2.1固件,也就是说我使用的是Darwin kernel v10的A​​RM端口。第二。我必须使用 GNU,因为 iPhone 没有 NASM:本机工具链(Mac OS X 上的 Xcode 和 linux 上的开源工具链)使用 GCC。所以我收集了有关以下方面的基本信息: - 如何用 GNU 编写程序集作为语言;- 什么是基本的 ARM 指令、寄存器、内存访问。

但即使是 HelloWorld 也需要内核调用才能写入标准输出。我的问题是:使用什么内核调用以及如何使用(哪些参数去哪里);我应该使用 swi #ARM 指令,不是吗?

那么,您能否发布一些信息/链接到教程,或者有 ARM Darwin Hello world asm 代码的人?

截至目前,我可以这样做:

但是,在 ARM 上,我只能这样做:

那么,请问有人吗?

0 投票
2 回答
736 浏览

ios - 我可以找到创建命名 OSMallocTag 的库吗?

我使用分配工具来测量我的 iOS 应用程序中的堆使用情况。我发现在标签名称为“Memory Tag 70”的区域中分配了大量内存,我想知道谁对此负责,所以我可以追查:

  • 我是否适合尝试对这段记忆做任何事情
  • 如果是这样,我应该怎么做(即什么代码在该区域分配对象)。

那么,我可以追踪OSMalloc_tagAlloc()带有特定参数的调用来自哪里吗?我愿意接受我可能只能在模拟器中运行时才能这样做,而不是在设备上。但即使是这样,我该怎么办呢?我可以dtrace显示标签名称吗?如果可以,我可以通过在模拟器中启动我的应用程序dtrace -c吗?如何?

0 投票
2 回答
2296 浏览

multithreading - OS X 有哪些类型的线程?

内核级线程(如 Linux 和一些 *BSD 系统)还是其他?如果有任何区别,我正在使用 pthreads。

0 投票
3 回答
5110 浏览

c++ - G++ 警告:为不受支持的文件格式构建,该文件格式不是被链接的体系结构

每当我尝试编译我的项目(使用命令行g++ *.hpp *.cpp 2> log.txt)时,这就是我得到的:

log.txt

关于为什么会发生这种情况的任何想法?我在 OSX 10.6 下(使用最新的开发者工具)

0 投票
1 回答
397 浏览

osx-snow-leopard - 在 Mac VFS/HFS+ 中是否可以进行原子重命名?

在 Mac OS X 中支持 ACL,有一种方法可以将文件声明为可写但不可删除。

这给原子写入带来了问题,因为VFS 中的当前实现是预先存在的目标。如果您有一个现有的文件,您对其具有写入权限,则可能无法自动写入: 只需附加一个 ACL 声明和原子写入(如由各种 Cocoa API 实现 - 例如NSArray's)将失败,而非原子写入将很高兴成功。renamedelete
deny deletewriteToFile:atomically:

由于我对低级 C 代码的理解相当有限:
只有轻微(插入您最喜欢的“轻微”定义)头痛的替代实现是否可行?

谢谢

丹尼尔

0 投票
1 回答
854 浏览

macos - 如何分配可能由操作系统回收的内存缓冲区以缓存在 Mac OS X 内核扩展中?

根据我阅读的文档和 xnu 源,我了解 Mac OS X使用统一缓冲区缓存 (UBC)缓存文件I/O。UBC 会根据可用 RAM 尽可能地增长,但是当内存变得更紧时,UBC 页面是最先被牺牲的页面。

在我的驱动程序中,我处理各种磁盘元数据。我希望能够使用 UBC 或类似机制来保留这些数据的 MRU 缓存以加快速度,同时让内核能够在需要时收回该内存。然而,元数据并不代表文件数据,因此不直接属于 UBC 的域。是否有我可以使用的较低级别的机制,或者我可以以某种方式仅使用 UBC 中处理缓冲区本身的部分?

我目前正在寻找 HFS+ 源代码,试图弄清楚它是否以及如何缓存文件系统元数据,尽管没有取得多大成功。

主要的替代方案当然是为缓存保留一个特定的内存区域并进行我自己的 LRU 剔除。我可以选择固定的缓存大小或使用某种启发式方法,但是当 RAM 充足时它总是会使用太少的内存,而当它不充足时它总是会使用太多的内存。

更新:

在搜索了更多之后,我发现IOBufferMemoryDescriptor可以使用该kIOMemoryPurgeable选项创建实例。这使您可以调用IOMemoryDescriptor::setPurgeable()它来标记要丢弃的内存“公平游戏”。我会尝试并用结果更新问题。