我如何创建一个动态库(dylib)与工业化?
-
10-07-2019 - |
题
我建筑些命令行公用事业模式(平C,没有可可豆).我希望所有的他们使用我的定制版本的libpng,我想保存的空间分享的一个副本的图书馆中所有可执行文件(我不介意重新分配 .dylib
与他们)。
我需要做一些魔法得到libpng出口的符号?
做 "链接二进制与图书馆" 建立相链接的静态?
苹果文件提及载的图书馆运行的时间 dlopen
, 但我怎么可以让模式创建可执行没有抱怨缺少的符号?
我想我已经想出来:
libpng不是联正确的,因为我已经建立了32/64位的可执行文件和32位的图书馆。建立设置的库和可执行程序必须一致。
libpng的配置。h需要有大量的定义等
#define FEATURE_XXX_SUPPORTED
"链接二进制与图书馆" 建立相处理动态的图书馆刚刚好,
DYLD_FALLBACK_LIBRARY_PATH
环境变量是必要的用于装载.dylib
自的应用程序包。
解决方案
你可能需要确保动态库建立具有出口的符号文件,其中列出了什么应该是导的图书馆。这只是一个平面列出的符号,每个线,以出口。
此外,当您的动态库建成,它得到一个 安装的名字 内嵌入的,它是默认情况下,路径,它是建立。随后的任何链接反对将期待它在指定路径的第一和唯一的后搜索(小)组默认路径描述下 DYLD_FALLBACK_LIBRARY_PATH
在 dyld(1)
人页.
如果你要把这个图书馆接下来你可执行,应该调整其安装名字要参考。只是做一个谷歌搜索"安装的名字"应该把大量的信息,在这样做。
其他提示
动态联Mac OS X上,一个微小例子
步骤:
- 创建一个图书馆libmylib.dylib含mymod.o
- 汇编和链接"callmymod"呼吁它
- 呼叫mymod从callmymod,使用DYLD_LIBRARY_PATH和DYLD_PRINT_LIBRARIES
问题:你"只是"想要创建一个图书馆的其他模块的使用。但是有一项艰巨的堆的计划--海湾合作委员会,ld,macosx libtool,dyld-- 有不计其数的选择,一些腐烂的堆肥和之间的差异MacOSX和Linux。有大量的人的网页(I count7679 + 1358 + 228 + 226 线在10.4.11ppc) 但没有太多的例子,或程序用"告诉我你在做什么"的模式。
(最重要的事情在谅解是,作一个简化 概览自己:画一些图片,进行一些小的例子, 解释给其他人).
背景: 苹果OverviewOfDynamicLibraries, 维基百科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,运行callmymod联libmylib.dylib--
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
这是glibtool在mac
和 SCons.)
欢呼
--丹尼斯
不幸的是,在我的经验苹果的文件是陈旧的、多余和失踪很多共同的信息通常会的需要。
我写了一堆东西在这在我的网站在哪里我不得FMOD(声API)工作的与我的交叉平台游戏,我们制定的统一。它是一个奇怪的过程中,我惊讶的是,苹果不添加更多信息在他们开文档。
不幸的是,因为"邪恶"如Microsoft,他们实际上做得更好的照顾他们的开发与文件(这是来自一个苹果福音传教士).
我认为基本上,你什么都不做你之后已编制了你的.应用程序包。然后你需要运行命令,上可执行的二进制/MyApp。应用程序/contents/mac os/MyApp为了改变那里的可执行起来为其图书馆的文件。你必须创建一个新的建立阶段,可以运行一个脚本。我不会解释这一过程再次,我已经做到了在深度:
http://brockwoolf.com/blog/how-to-use-dynamic-libraries-in-xcode-31-using-fmod
希望这会有所帮助。
你知道还有苹果的参考页 动态库编程的主题?它应该涵盖的大多数你需要什么。要知道,有一个共用图书馆得到满载无条件地在程序启动和动态加载的图书馆(包,请参考),这是载于需求,并且两者是有所不同on mac os X从该当量在Linux或Solaris。