我正在尝试使用makeg来编译其他人使用cygwin编写的程序。我收到很多错误消息,其中很多提示error: template with C linkage

在四处搜寻之后,问题似乎与extern "C"有关。该行包含在文件cygwin/usr/include/pthread.h中,该文件包含在头文件之一的#include < pthread.h >中。当我删除此行时,大多数错误消息都消失了。但是还剩下以下几种:

/usr/include/pthread.h:67:5: error: previous declaration of ‘int pthread_atfork(void (*  )(),void ( *)(), void ( *)())’ with ‘C++’ linkage

/usr/include/sys/unistd.h:136:5: error: conflicts with new declaration with ‘C’ linkage

有谁知道如何解决这一问题?我想坐下来详细学习所有这些知识,但是我没有时间来运行此程序。

最佳答案

编辑:基于注释中的交换,罪魁祸首是构建目录(Endian.h)中的头文件,该文件与系统包含文件/usr/include/endian.h冲突。它被包括而不是系统头文件,并导致生成问题。这些文件存在冲突,因为在Windows上大小写无关紧要。根本原因是原始答案中建议的内容。 extern C构造无意间泄漏到C++代码中,在此定义了模板,从而导致指示的错误。

我会在头文件中的某处检查“悬挂”的C链接构造。这将是您编写的代码(不是任何系统头文件;它们可能是安全的)。

header 中的代码包含在其中,

在上面:

#ifdef __cplusplus
extern "C" {
#endif

在底部:
#ifdef __cplusplus
}
#endif

如果缺少底部,则上半部分的效果会无意间扩展到其他 header 中的代码中。这会导致出现类似您遇到的问题。

10-08 08:20
查看更多