【问题标题】:C - issue with linking libraries which implement the same namesC - 链接实现相同名称的库的问题
【发布时间】:2021-03-25 12:37:29
【问题描述】:

我正在尝试在同一个项目中使用 freetype-glcgml,但它们都实现了诸如“vec2”之类的名称,但方式完全不同(一个作为结构,另一个 - 作为浮点数组),这意味着重新定义会导致错误

我真的不想替换其中一个模块中的所有名称来解决这个问题,还有其他方法吗?

【问题讨论】:

  • 是的,有。使用两个模块的一种方法。
  • 标准的 c 解决方案是前缀符号。您是否检查过是否有任何构建魔法?不要将它们链接在同一个二进制文件中并使用 IPC,这会很烦人。你不链接标题,你链接库。
  • @user14063792468 dlopen?
  • @AllanWind 不同的 .c 文件应该转到不同的 .o 模块。您可以在两个不同的模块中拥有同名的typedef's。您可以从另一个模块中的一个模块调用函数。这不是基本的C 范式吗?
  • 当您将这些 .o 文件链接到单个二进制文件中时,您会遇到名称冲突(函数或原始类型。typedef 将用于您的代码,但这是第 3 方库)。

标签: c compilation linker


【解决方案1】:

C99 不允许 2 个相同的定义

C99 标准提到了这一点: J.5.11 多个外部定义 一个对象的标识符可能有多个外部定义,无论是否显式使用关键字 extern;如果定义不一致,或者不止一个被初始化,则行为未定义 (6.9.2)。

2 个相同的定义

初始化定义

两个相同的初始化定义导致编译错误。

暂定定义

文件范围内未初始化的定义被视为“暂定”。暂定定义可以重复。初始化定义会移除暂定状态。

如果你强制这样做。 使用编译选项。 -Wredundant-decls 如果在同一范围内多次声明任何内容,则发出警告,即使在以下情况下 多重声明是有效的,没有任何改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2021-03-29
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    相关资源
    最近更新 更多