我发现使用模块定义(.def)文件和导出的友好名称从dll(windows)导出函数的方式很有趣,但我找不到任何关于如何在Mac上完成的信息
我想知道OS X上是否有相应的模块定义。
答案 0 :(得分:1)
您正在寻找的主要部分(如果我理解的话)可以使用链接器的-alias <symbol_name> <alternate_symbol_name>
和-alias_list <filename>
选项(ld
)来完成。您可以使用-exported_symbol <symbol>
和-unexported_symbol <symbol>
及其文件列表对应-exported_symbols_list <filename>
和-unexported_symbols_list <file>
来实现其他控制。
答案 1 :(得分:1)
使用.def文件强制导出符号的更简单的命名约定是真的不是要走的路 - 通常一旦你在那个级别遇到错位问题,很有可能会有别的东西出问题。我的问题基于您问题中的C++
标记。
通常编译器/链接器将生成正确的修改以匹配您要导出的代码(如果您打算连接C++
代码),这样当您尝试使用它时,链接器错误将指示您&# 39;重新考虑二进制兼容性,并且链接可能是你问题中最不重要的 - 所有人都会陷入潜在的不兼容的分配器等等。
你应该导出一个简单的&#34; C&#34; api,它将减少链接的复杂性 - 有一个定义明确的C链接,并且例程将获得简单的链接名称。
这是.h档案中警卫的一般目的:
#ifdef __cplusplus
extern "C" {
#endif
… library exports …
#ifdef __cplusplus
}
#endif
这将自动为您提供非常简单的链接名称,而不是您尝试链接C ++代码时通常会看到的卷积 - 只要您#include
编译.h
文件时.cpp
文件1}}文件,只要有.h
中要导出的例程的声明在.cpp
中有相应的定义,它们就会被自动导出为解码。
你仍然可以使用Ken Thomases提供的答案 - 他们会给你符号可见性和符号别名,但是TBH,听起来你正试图适应你在windows中使用的解决方案到另一个平台,但对我来说,似乎你一开始就在Windows平台上使用了不正确的方法。
历史/联系评论:
我还要提到Windows上的
.def
文件支持实际上是由Windows上的不同导出机制引起的 - 它最初是按顺序从.dll
文件导出符号 - 即a因此,您必须使用def文件将名称链接重新映射回相关数字,以便了解调用约定等内容。大多数unix / linux系统从不导出只编号的索引,这意味着API中定义的名称可以直接链接 从windows@<number>
文件导出的函数名末尾的稍微有问题的.dll
项现在表示参数所需的字节数。__stdcall
调用约定添加了这个以确保调用者理解被调用的函数在返回之前将从栈中弹出该字节数,以便调用者可以清除函数调用的任何可能的额外参数。 (这只是理论上的 - 编译器会自动将变量例程转换为cdecl调用约定,以便在默认情况下消除此问题。)
其他平台上的ABI不会使用调用约定,这可以将调用者和被调用者之间的堆栈清理责任分开,因此,默认情况下不要像这样进行修改。保护&#39;