通常的方法是使用具有汇编程序以及C/C++编译器的构建环境和工具。编译器(和汇编程序)获取源文件并生成中间目标文件格式。在Microsoft Windows上,使用Microsoft Tools,这些将是.obj文件。
然后使用链接器将.obj文件(可能由各种语言生成) - fortran,cobol,C++,c,objective-c,assembly等链接到单个应用程序二进制文件中。
目标文件基本上是导出符号的集合,标记了很少的字节块和未解析的符号,标记了在链接期间需要修补的字节块,以指向不同目标文件中的某些内容。
现在,一般的问题 - 在平台上的伊夫经历了哪些不接近你,是,C++编译器不与任何一种考虑跨语言的二进制兼容性制成。另一方面是C编译器。所以C++编译器会创建高度破坏的符号,将各种关于参数和返回类型的信息合并到符号名称中。这种机制是使操作员超载成为可能的原因。
无论如何,关键是,
- 你需要建立ASM文件。如果你没有汇编程序,那么你太幸运了。它可能需要来自同一供应商作为您的c/C++工具集
- 您需要告诉您的C++程序的外部符号的名称。以c兼容的方式。这是通常使用的头文件。
因此,创建一个头文件来保存函数声明为PID码和置身其中就像这样:
的extern“C”无效PidMain(无效);
现在的#include在C即头文件++程序,并确保由器产生的目标文件都包含在你的环境中链接步骤,你应该是金色的。
可能会涉及某种调用约定。一些环境对于将物品推入堆栈的顺序和/或负责堆栈清理的人员有不同的标准。大多数ms windows工具集至少支持__pascal和__cdecl调用约定,所以declration看起来像
extern“C”void __pascal PidMain(void);
我没有具体的知识,如果有在特定环境中的多个调用约定。所以我不知道这是多么有帮助。祝你好运我猜。
对于C++,他还需要在函数声明中使用'extern“C”'。 – 2009-09-04 08:19:59
@Pavel:谢谢,补充。 – 2009-09-04 08:22:03
正如其他答案中所述,将obj文件链接在一起。 – simon 2009-09-04 13:05:47