gpt4 book ai didi

xcode - 如何使用 Xcode 创建动态库 (dylib)?

转载 作者:行者123 更新时间:2023-12-02 10:36:09 36 4
gpt4 key购买 nike

我正在 Xcode 中构建一些命令行实用程序(纯 C,无 Cocoa)。我希望他们所有人都使用我的自定义版本的 libpng,并且我想通过在所有可执行文件之间共享该库的一份副本来节省空间(我不介意与他们重新分发 .dylib) .

我需要施展一些魔法才能获得 libpng 导出符号吗?

“将二进制文件与库链接”是否静态构建阶段链接?

Apple 的文档提到在运行时使用 dlopen 加载库,但是如何让 Xcode 创建可执行文件而不提示缺少符号?

<小时/>

我想我已经明白了:

  • libpng 没有正确链接,因为我已经构建了 32/64 位可执行文件和 32 位库。库和可执行文件的build设置必须匹配。

  • libpng 的 config.h 需要有大量定义,例如 #define FEATURE_XXX_SUPPORTED

  • “链接二进制文件与库”构建阶段可以很好地处理动态库,并且 DYLD_FALLBACK_LIBRARY_PATH 环境变量是加载 .dylib 所必需的>来自应用程序包。

最佳答案

Mac OS X 上的动态链接,一个小例子

步骤:

  1. 创建包含 mymod.o 的库 libmylib.dylib
  2. 编译并链接一个调用它的“callmymod”
  3. 使用 DYLD_LIBRARY_PATH 和 DYLD_PRINT_LIBRARIES 从 callmymod 调用 mymod

问题:您“只是”想创建一个库供其他模块使用。然而,有一堆令人畏惧的程序——gcc、ld、macosx libtool、dyld——有无数的选择,一些腐烂的堆肥,以及 MacOSX 和 Linux 之间的差异。有大量的手册页(我数了一下 10.4.11 ppc 中有 7679 + 1358 + 228 + 226 行)但没有太多示例或带有“告诉我你在做什么”模式的程序。

(理解中最重要的是做一个简化的自己概述:画一些图,运行一些小例子,向其他人解释一下)。

背景:apple OverviewOfDynamicLibraries , Wikipedia Dynamic_library

<小时/>

第1步,创建libmylib.dylib --

mymod.c:
#include <stdio.h>
void mymod( int x )
{
printf( "mymod: %d\n", x );
}
gcc -c mymod.c # -> mymod.o
gcc -dynamiclib -current_version 1.0 mymod.o -o libmylib.dylib
# calls libtool with many options -- see man libtool
# -compatibility_version is used by dyld, see also cmpdylib

file libmylib.dylib # Mach-O dynamically linked shared library ppc
otool -L libmylib.dylib # versions, refs /usr/lib/libgcc_s.1.dylib
<小时/>

第2步,编译并链接callmymod --

callmymod.c:
extern void mymod( int x );
int main( int argc, char** argv )
{
mymod( 42 );
}
gcc -c callmymod.c
gcc -v callmymod.o ./libmylib.dylib -o callmymod
# == gcc callmymod.o -dynamic -L. -lmylib
otool -L callmymod # refs libmylib.dylib
nm -gpv callmymod # U undef _mymod: just a reference, not mymod itself
<小时/>

第 3 步,运行链接到 libmylib.dylib 的 callmymod --

export DYLD_PRINT_LIBRARIES=1  # see what dyld does, for ALL programs
./callmymod
dyld: loaded: libmylib.dylib ...
mymod: 42

mv libmylib.dylib /tmp
export DYLD_LIBRARY_PATH=/tmp # dir:dir:...
./callmymod
dyld: loaded: /tmp/libmylib.dylib ...
mymod: 42

unset DYLD_PRINT_LIBRARIES
unset DYLD_LIBRARY_PATH

一个小例子到此结束;希望它有助于理解这些步骤。
(如果您经常这样做,请参阅GNU Libtool这是 Mac 上的 glibtool,和 SCons .)

关于xcode - 如何使用 Xcode 创建动态库 (dylib)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/194485/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com