通常的方法是使用具有汇编器和 C/C++ 编译器的构建环境和工具。编译器(和汇编器)获取源文件并生成中间目标文件格式。在 Microsoft Windows 上,使用 Microsoft 工具,这些将是 .obj 文件。
然后使用链接器将 .obj 文件(可能由多种语言(fortran、cobol、c++、c、objective-c、程序集等)生成)链接到单个应用程序二进制文件中。
目标文件基本上是导出符号的集合,标记小块字节和未解析的符号,标记在链接期间需要修补以指向不同目标文件中的某些内容的字节块。
现在,通常的问题 - 在我经历过的与您不接近的平台上,c++ 编译器没有考虑到任何类型的跨语言二进制兼容性。另一方面,C 编译器是。因此,c++ 编译器制作了高度混乱的符号,将有关参数和返回类型的各种信息合并到符号名称中。这种机制使运算符重载成为可能。
总之,关键是,
- 您需要构建 asm 文件。如果您没有汇编程序,那您就不走运了。它可能需要来自与您的 c/c++ 工具集相同的供应商
- 您需要告诉您的 c++ 程序外部符号的名称。以交流兼容的方式。这就是通常使用头文件的目的。
因此,创建一个头文件来保存 pid 代码的函数声明,并在其中放置类似这样的内容:
extern "C" void PidMain(void);
现在,在你的 c++ 程序中#include 那个头文件,并确保汇编器生成的目标文件包含在你的环境链接步骤中,你应该是黄金。
可能涉及某种调用约定。一些环境对于将事物压入堆栈的顺序和/或谁负责堆栈清理有不同的标准。大多数 ms windows 工具集至少支持 __pascal 和 __cdecl 调用约定,因此 declration 看起来像
extern "C" void __pascal PidMain(void);
如果您的特定环境中有多个调用约定,我没有具体知识。所以我不知道这有多大帮助。我猜祝你好运。