C++ OSX的.def等效文件

C++ OSX的.def等效文件,c++,macos,dllimport,dylib,dllexport,C++,Macos,Dllimport,Dylib,Dllexport,我发现了一种有趣的方法,可以使用模块定义(.def)文件和友好的导出名称从dll(windows)导出函数,但我找不到有关如何在Mac上实现这一点的任何信息 我想知道在OS X上是否有模块定义的等价物。您正在寻找的主要部分(如果我理解的话)可以使用链接器的-alias和-alias\u list选项(ld)来完成。您可以使用-exported\u symbol和-unexported\u symbol及其对应的文件列表-exported\u symbols\u list和-unexported\

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


我想知道在OS X上是否有模块定义的等价物。

您正在寻找的主要部分(如果我理解的话)可以使用链接器的
-alias
-alias\u list
选项(
ld
)来完成。您可以使用
-exported\u symbol
-unexported\u symbol
及其对应的文件列表
-exported\u symbols\u list
-unexported\u symbols\u list
来实现额外的控制(如果我理解的话)可以使用链接器(
ld
)的
-alias
-alias\u列表
选项来完成。您可以使用
-exported\u symbol
-unexported\u symbol
及其对应的文件列表
-exported\u symbols\u list
-unexported\u symbols\u list
来实现额外的控制。使用.def文件强制导出符号使用更简单的命名约定确实不是一种方法,通常是一次性的你在这个层次上有很多问题,很有可能其他方面会出问题。我是根据你问题中的
C++
标记来做这件事的

通常,如果您打算连接
C++
代码,编译器/链接器将生成与您正在导出的代码匹配的正确碎片,这样当您尝试使用它时,链接器错误将表明您偏离了二进制兼容性,而链接可能是你的问题中最小的一个——你们都误入了可能不兼容的分配器,等等

您应该导出一个简单的“C”api,这将减少链接的复杂性-有一个定义良好的C链接,例程将获得简单的链接名称

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

#ifdef __cplusplus
extern "C" {
#endif

… library exports …

#ifdef __cplusplus
}
#endif
<>这将自动地获得与链接C++相比通常更简单的链接名称,只要你在编译< <代码> .CP> < /C>文件时,只要你<代码> >包含<代码> >代码> h >代码>文件,只要在
.h
中有要导出的例程的声明,并且这些声明在
.cpp
中具有相应的定义,它们就会被自动导出

您仍然可以使用Ken Thomases answer提供的答案-它们将为您提供符号可见性和符号别名,但是TBH,听起来您似乎在尝试将您在windows中使用的解决方案与另一个平台相适应,但在我看来,您似乎在windows平台中首先使用了不正确的方法

历史/联系评论:

我还要提到的是,windows上对
.def
文件的支持实际上是由windows上不同的导出机制造成的-它最初是按顺序从
.dll
文件导出符号-即一个数字,因此您必须使用def文件将名称链接重新映射回所讨论的数字,以便理解比如电话会议。大多数unix/linux系统从不只导出带编号的索引,这意味着可以直接链接API中定义的名称。
现在,从windows
.dll
文件导出的函数名末尾的稍微有些混乱的
@
项表示参数所需的字节数。
\uuu stdcall
调用约定添加了这一点,以确保调用方理解被调用函数将在返回之前从堆栈中弹出该数量的字节,以便调用方可以清除函数调用的任何可能的额外参数(这只是理论上的-编译器会自动将变量例程转换为cdecl调用约定,以在默认情况下消除此问题)。
其他平台上的ABI不使用调用约定,这种约定可以在调用者和被调用者之间分担堆栈清理的责任,因此,默认情况下,不会因为“保护”而出现这样的混乱


使用.def文件对导出的符号强制使用更简单的命名约定确实不是一种好办法-通常,一旦在该级别出现了损坏问题,很有可能会出现其他问题。我是根据您问题中的
C++
标记得出这一结论的

通常情况下,如果您打算连接
C++
代码,编译器/链接器将生成与您正在导出的代码相匹配的正确碎片,这样,当您尝试使用它时,链接器错误将表明您偏离了二进制兼容性,而链接可能是您的最小问题-所有人都偏离了可能性不兼容的分配器等

您应该导出一个简单的“C”api,这将减少链接的复杂性-有一个定义良好的C链接,例程将获得简单的链接名称

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

#ifdef __cplusplus
extern "C" {
#endif

… library exports …

#ifdef __cplusplus
}
#endif
<>这将自动地获得比链接C++时更常见的简单的链接名称,只要您在编译< <代码> .CP> < /C>文件时,只要代码< >代码>包含< <代码> > <代码>文件,只要您希望在<>代码>中导出例程的声明,就可以了。在
.cpp
中具有相应定义的,将自动导出它们

您仍然可以使用Ken Thomases answer提供的答案-它们将为您提供符号可见性和符号别名,但是TBH,听起来您似乎在尝试将您在windows中使用的解决方案与另一个平台相适应,但对我来说,您似乎使用了不正确的appr