1

我正在创建一些包含 C 或 Objective-C 代码的静态库(MyLib、OtherLib),并且我希望每个模块都能够访问静态库的名称。

我可以做一个

const char* mylibname = "MyLib";

并在任何地方使用它。但是,我想要一个更方便的方法,每个库中的每个文件都可以通过 constant 访问其库currentlibname。所以当一个文件在 MyLib 中时,currentlibname它的值为“MyLib”,当它在 OtherLib 中时,它的值为“OtherLib”。

关于最方便的解决方案的任何想法?理想情况下,所有的魔法都应该在一个地方,除了包含声明的内容之外,不需要调整每个文件mylibname

问候, 约臣

4

1 回答 1

2

这显然取决于操作系统、编译器和构建器。

如果你在 Linux 上有动态库,你可以在运行时检索一些信息,也许是通过/proc/self/maps,也许dladdr是(甚至可能是返回地址 builtins)。

我的建议是在每个库的构建过程中定义一个预处理器符号,也许CFLAGS += -DTHIS_LIBRARY_NAME=MyLib在你的Makefilemylib.h使用它的东西中。对于 CI 可能会建议放入类似的mylib.h东西

#define QUOTE_NAME(N) #N
static inline const char *this_library_name () 
{ return QUOTE_NAME(THIS_LIBRARY_NAME); }

顺便说一句,您甚至可以将上述代码放在您的库主头文件包含的一个通用单个头文件中。

但我有点惊讶你这么问。更好的方法可能是为你的库版本提供一个 API,看看gtk 对特性测试做了什么。

于 2012-10-14T10:34:09.710 回答