你可以使用弱函数来做到这一点。
在您的静态库中,声明您要使用的所有 ccc 函数,如下所示:
int cccfunction(void) __attribute__((weak));
不要在你的库中包含 ccc。
由于函数被声明为弱函数,编译器不会抱怨它们的缺失,但是您可以在代码中引用它。
然后,当您将库分发给用户时,给他们一个 .c 文件,其中包含空的 ccc 函数,返回 0/null。
当 ccc 库不可用时,这是必需的。
如果导入 CCC 库,用户必须删除此文件。
LOOK at this project
执行 IOSLibraries 并查看日志。
在第一次执行时,您会在日志中看到
CCC not found <--- this line is printed by libstatic (your library)
如果你进入 optional.c 文件并注释 cccfunction(),你会在日志中看到
Executing a function of CCC <--- this line is printed by libccc
CCC has been found and the function has been executed <--- this line is printed by libstatic (your library)
如果您同时删除 ccc 库和 optional.c 文件,您将看到
架构 xxxxxx 的未定义符号:
“_cccfunction”,引用自:
libstaticfirst_universal.a中的_wrapper_cccfunction(wrapper_cccfunction.o)
这就是您需要发布 optional.c 文件的原因,因此用户编译器不会抱怨找不到方法。
当用户拥有 CCC 库时,他可以简单地删除或注释 optional.c 文件。
在您的库中,您将能够通过查看某些控制函数的返回值来测试 CCC 库是否存在
编辑 - 旧答案:在意识到您在 iOS 上之后,以下(也是第一个)答案变得无效。动态链接仅适用于 OSX。但是,我将旧答案留给使用 OSX 的人
老答案
我认为
我假设 CCC 是一个静态库(如果它是动态的则更简单)。在这种情况下,AFAIK,你不能“自动”做任何事情,但是一个很好的折衷办法可以是这样的,使用动态库
用户项目 --include--> 你的静态库 --include--> 动态库 --can include--> CCC 库
创建两个版本的动态库:
实现,例如,CCC 库的空函数 -> 当您调用该函数时,它们返回 0/null 并且您知道该库未实现。你甚至可以使用更智能的东西(一个简单的控制功能)
给用户第二个动态库的源代码,他们只需在项目内拖放CCC库,然后将编译好的库移动到正确的位置即可编译。这不是您的库的源代码(您的代码是在静态部分编译的),而只是您从静态库中调用的包装函数的代码。
您的静态库不直接调用 CCC 库的函数,而只调用始终存在的包装函数(在“空动态库”和“由用户编译的动态库”中)
通过这样做,用户可以将“空”动态库替换为包含 CCC 的动态库。
如果动态库是链接CCC的,最终工程会使用CCC的功能,否则不使用。
Look at the attached example:
- LibTests 项目实现 lib libstaticlib.a 并调用其函数“usedynamic(int)”
- libstaticlib.a 实现动态库 libdynamic1 并调用其函数“firstfunction(int)”
- libdynamic1 有两个不同的副本:一个有一个 firstfunction() 返回传递的数字,另一个返回数字*2
现在,打开 LibTests(应该是您用户的项目),复制 /usr/local/lib/ 中两个已编译动态库中的第一个,然后执行 LibTests:您将在控制台中看到“10”。
现在,将动态库更改为第二个,您将看到“20”。
这就是用户必须做的事情:您出售带有动态“空”组件的库。如果用户购买了CCC,你给出了如何编译绑定CCC的动态组件的说明和代码。动态库构建完成后,用户只需切换.dylib文件