fif*_*ght 7 linker programming-languages compilation
我不是在问关于何时连接不同的编程语言.
这是一个非常普遍的问题,但我个人在Linux上工作.
我想要理解的是可以组合不同编程语言的过程,我发现了一篇关于组合C/C++/Fortran的好文章:http: //www-h.eng.cam.ac.uk/help/tpl/ languages/mixinglanguages.html.
据我所知,大多数编译器执行两个阶段:
将语言文件转换为包含机器代码但仍包含一些符号(可能是函数名称?)的目标文件
将目标文件链接在一起,仅在此阶段,链接器检查目标文件中的函数是否可调用.
我认为组合不同语言的问题是名称错误,这意味着函数的名称在转换为目标代码时会发生变化.
问题是:
你不能以某种方式预先发现受损的函数名称,而不是在编程语言中明确地指定它们或更好地关闭它们,是不是已经有这样的软件?
我不完全理解动态库是如何链接的,但是不同的语言可以通过程序与动态库交互的相同方法进行交互?
ps主要目的是调用用另一种语言编写的函数.
将不同目标文件链接在一起的问题通常归结为子程序调用约定.基本上,当您调用另一个目标文件中的例程时,您的编译器必须知道其他对象文件将在内部命名其例程,如何传递其所有参数,以及(如果有)设置和清理代码例程将需要.所有这些东西通常在调用约定 s 的标题下组合在一起.
每个编译器都有自己喜欢用于子例程的调用约定.注意我说"编译器",而不是语言.Linux中的C调用约定与Windows上的C调用约定不同.
因此,当您混合语言时,您需要某种方式告诉编译器调用或调用子例程以使用其他语言的调用约定.C的约定是一种流行的用法,因为几乎每个平台都有一个C编译器.但是,某些平台(例如:Windows)具有多种流行的调用约定.
所以现在我们在评论中提出你提出的问题:
是否有一种"告诉编译器使用其他语言的调用约定"的常用方法?
答案是,"不,不是真的".有些语言确实使用了特定的其他语言的调用约定.例如,C++允许您extern "C"
使用声明来告诉编译器有问题的声明使用C调用约定.Ada完成同样的事情pragma Convention (X,...)
,其中X是常规名称.C
,Fortran
和Cobol
,由语言定义,但支持的任何其他东西(例如:Windows' Stdcall
)是实现定义的.
但是,如果你有一对编译器编写者从未想过彼此的语言,那么你别无选择,只能告诉他们使用他们都知道的第三种约定(通常是C).例如,要使标准 C++和Ada进行互操作,您需要使用C约定将服务器代码导出其例程,并告诉客户端代码它正在调用的例程正在使用C约定.