typedef 结构在链接静态库时会导致名称冲突吗?

Posted

技术标签:

【中文标题】typedef 结构在链接静态库时会导致名称冲突吗?【英文标题】:Can typedef structures cause name ***es when linking a static library? 【发布时间】:2014-02-18 03:01:32 【问题描述】:

当我创建静态库时,typedef 结构会导致名称冲突吗?

鉴于下面的示例头文件,我知道myFun() 将是一个外部符号,并且可能与具有myFun() 函数的任何其他库发生冲突。为避免这种情况,最好的办法是给 myFun() 一个更长、更具体的名称。

// myFile.h

typedef struct

    int myVar;
 myStruct;

void myFun(myStruct * input);

myStruct 是一个外部符号,在与另一个库链接时可能会导致命名冲突?

当我使用nm myLib.a 查看.a 静态库文件时,为什么它没有被列出?

【问题讨论】:

【参考方案1】:

不,名称只能通过链接在库(或源文件)外部可见,而在 C 中,类型没有链接。 C11 §6.2.2/2:

在构成整个程序的翻译单元和库集合中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。

不同翻译单元中的两个struct 定义(通常来自包含一个公共标题)必须匹配到一定程度的相似性才能实现相互兼容,但从概念上讲,每个翻译单元都有自己独特的数据集-类型。

在 C++ 中,理论上您会担心,因为类类型以及与类类型一起声明的 typedef 名称确实具有链接。但是,实际上链接器不会看到它们。

所以,真的没什么好担心的。

【讨论】:

因此,如果我有两个不同版本的库链接并且 myStruct 在每个版本中都不同,那么就会出现问题。通过“具有外部链接的特定标识符的每个声明都表示相同的对象或函数”,我认为它们应该是相同的? @Markus 如果将同一个库的两个副本链接在一起,无论它们是否相同,都会出现重复的定义错误。 “表示相同的对象或函数”意味着它们中只有一个,并且它在库中。没有两件事是相同的。这不适用于structs 等类型。 (基本上)相同定义的要求确实适用于structs,但这不是链接。您使用的头文件中的定义需要与用于编译库的头文件中的定义兼容(基本上相同)。

以上是关于typedef 结构在链接静态库时会导致名称冲突吗?的主要内容,如果未能解决你的问题,请参考以下文章

VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结

VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结

VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结

Rust有相当于C的typedef吗?

为啥“WinMain”在链接为 *.a 静态库时无法解析?

请教库冲突的导致的 duplicate symbol 链接错误