OS X 等效的 .def 文件

.def file equivalent for OS X

我发现了一种使用模块定义 (.def) 文件和导出的友好名称从 dll (windows) 导出函数的有趣方法,但我找不到任何关于如何导出的信息可以在 Mac.

上完成

我想知道 OS X 上是否有任何等效的模块定义。

您正在寻找的主要部分(如果我理解的话)可以使用链接器的 -alias <symbol_name> <alternate_symbol_name>-alias_list <filename> 选项来完成 (ld) .您可以使用 -exported_symbol <symbol>-unexported_symbol <symbol> 及其对应的文件列表 -exported_symbols_list <filename>-unexported_symbols_list <file>.

实现额外的控制

使用 .def 文件对导出的符号强制使用更简单的命名约定确实不是可行的方法 - 通常,一旦您在该级别遇到重整问题,就有一个很好的方法其他事情会出错的机会。我基于你问题中的 C++ 标签。

通常,如果您打算连接 C++ 代码,compiler/linker 将生成正确的改编以匹配您正在导出的代码,以便当您尝试使用它时 link er 错误将表明您偏离了二进制兼容性,并且 linkage 可能是您的问题中最少的 - 你们都偏离了可能不兼容的分配器等

你应该导出一个简单的 "C" api,这将减少 linking 的复杂性 - 有一个明确定义的 C linkage,例程将得到linking.

的简单名称

这是 .h 文件中守卫的一般用途:

#ifdef __cplusplus
extern "C" {
#endif

… library exports …

#ifdef __cplusplus
}
#endif

这将自动为您提供非常简单的名称 linking .h文件编译.cpp文件时,只要在.h中有你要导出的例程的声明,在.cpp中有对应的定义即可自动导出 demangled。

您仍然可以使用 Ken Thomases 回答提供的答案 - 他们会给您符号可见性和符号别名,但是老实说,听起来您正在尝试适应您在 [=43] 中使用的解决方案=] 到另一个平台,但对我来说,您似乎首先在 windows 平台中使用了不正确的方法。

Historical/linkage评论:

I'm also going to mention that the .def file support on windows is really caused by the different export mechanism on windows - it originally exported symbols from .dll files by ordinal - i.e. a number so you had to use the def file to remap the linkage of names back to the number in question in order to understand things like the calling conventions. Most unix/linux systems never exported only numbered indexes, which means that the names that were defined in the API could be linked directly.
The slightly manglesome @<number> items at the end of function names exported from windows .dll files nowadays indicate the number of bytes that are needed for parameters. The __stdcall calling convention adds this in order to ensure that the caller understands that the function being called will pop that number of bytes from the stack before returning, so that the caller can clean up any possible extra parameters for the function call (this is only theoretical - variadic routines are converted to the cdecl calling convention by the compiler automatically to eliminate this issue by default).
The ABIs on other platforms don't use calling convention that can split the responsibility of stack cleanup between the caller and callee like that, so as a result, don't get mangling like that by default for 'protection'.