Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免linux下共享对象C接口上的名称混乱 Windows下,我们有一个C接口(EXTEN)C“{//Loop}}”给我们的C++库,它使用模块定义文件(.DEF)导出未被修改的函数。_C++_C_Linux_Shared Objects_Name Mangling - Fatal编程技术网

避免linux下共享对象C接口上的名称混乱 Windows下,我们有一个C接口(EXTEN)C“{//Loop}}”给我们的C++库,它使用模块定义文件(.DEF)导出未被修改的函数。

避免linux下共享对象C接口上的名称混乱 Windows下,我们有一个C接口(EXTEN)C“{//Loop}}”给我们的C++库,它使用模块定义文件(.DEF)导出未被修改的函数。,c++,c,linux,shared-objects,name-mangling,C++,C,Linux,Shared Objects,Name Mangling,我正试图在linux下重现同样的东西,在linux下我相对缺乏经验。我知道在NIX系统下,默认情况下会导出所有函数。考虑到这一点,我创建了一个共享对象,并通过nm命令运行它 我惊讶地发现,与windows不同,我的函数名被弄乱了 我怎样才能防止这种情况发生呢?通常的解决方案是声明函数extern“C”。这不仅会导致名称在C中被损坏,而且函数也会使用C调用约定。通常的解决方案是声明函数extern“C”。这不仅会导致名称在C中被破坏,而且函数也会使用C调用约定。@pmg-抱歉,我已经修改了这个问题

我正试图在linux下重现同样的东西,在linux下我相对缺乏经验。我知道在NIX系统下,默认情况下会导出所有函数。考虑到这一点,我创建了一个共享对象,并通过nm命令运行它

我惊讶地发现,与windows不同,我的函数名被弄乱了



我怎样才能防止这种情况发生呢?

通常的解决方案是声明函数
extern“C”
。这不仅会导致名称在C中被损坏,而且函数也会使用C调用约定。

通常的解决方案是声明函数
extern“C”
。这不仅会导致名称在C中被破坏,而且函数也会使用C调用约定。

@pmg-抱歉,我已经修改了这个问题。您确定不只是要编译一个共享库,然后将主程序链接到它吗?在windows中通过.def文件执行的操作的基本功能在此处自动完成。gcc-x c可能吗?你的问题对我来说毫无意义。例如,如果将函数
myfunc(double)
声明为
extern“C”
,并且实现该函数的代码已经看到了该定义,那么它将不会在对象文件中被名称损坏。我想我们需要一个小型但完整的
extern“C”{//interface}
示例。您不应该有这个问题。@pmg-抱歉,我已经修改了这个问题。您确定不只是要编译一个共享库,然后将您的主程序链接到它吗?在windows中通过.def文件执行的操作的基本功能在此处自动完成。gcc-x c可能吗?你的问题对我来说毫无意义。例如,如果将函数
myfunc(double)
声明为
extern“C”
,并且实现该函数的代码已经看到了该定义,那么它将不会在对象文件中被名称损坏。我想我们需要一个小型但完整的
extern“C”{//interface}
示例。你不应该有这个问题。@James-谢谢你的回复,我们使用的是extern“C”,这就是我所说的“C接口”。我已经更新了这个问题,使之更清楚。@ScarletAmaranth,这取决于C编译器。从历史上看,大多数C编译器确实会损坏外部名称,但方式非常简单(最常见的是在
\uu
前面加前缀)。@dangerdave如果函数声明为
extern“C”
,则名称应与C函数完全相同。在Linux下使用g++时,这意味着没有损坏;对于大多数Unix编译器,这意味着名称的前缀只是一个
。@R我不确定它有什么混淆和误导之处。该标准的要求是,函数看起来完全像是用C编写的。这意味着必须使用与C中相同的损坏(我使用过的大多数C编译器都会损坏)。@JamesKanze o_o?C实际用于损坏外部名称?好吧,这对我来说是个新闻,我为我的评论道歉!:)@詹姆斯-谢谢你的回复,我们使用的是外部“C”,这就是我所说的“C接口”。我已经更新了这个问题,使之更清楚。@ScarletAmaranth,这取决于C编译器。从历史上看,大多数C编译器确实会损坏外部名称,但方式非常简单(最常见的是在
\uu
前面加前缀)。@dangerdave如果函数声明为
extern“C”
,则名称应与C函数完全相同。在Linux下使用g++时,这意味着没有损坏;对于大多数Unix编译器,这意味着名称的前缀只是一个
。@R我不确定它有什么混淆和误导之处。该标准的要求是,函数看起来完全像是用C编写的。这意味着必须使用与C中相同的损坏(我使用过的大多数C编译器都会损坏)。@JamesKanze o_o?C实际用于损坏外部名称?好吧,这对我来说是个新闻,我为我的评论道歉!:)