我有一个用 mingw (gcc for Windows) 编译的 C++ 程序。使用包含 gcc 4.4.1 的 mingw 的 TDM 版本。可执行文件链接到两个静态库 (.a) 文件:其中一个是用 C 编写的第三方库;另一个是我编写的 C++ 库,它使用 C 库提供了我自己的 C++ API。
C 库功能的一部分(在我看来是多余的)是在内联函数中实现的。当您使用 C 库的 API 时,您无法避免包含内联函数,但是当我尝试将它们全部链接在一起时,我收到链接错误,说所有内联函数都有多个定义 - 我都有在我的 C++ 包装器库和我没有调用的包装器库中调用,基本上在标头中内联定义的任何内容都已在 C 库和 C++ 库中为它创建了一个函数。
在同一个项目的不同.c或.cpp文件中多次使用include文件时,不会导致多次定义错误;问题只是它为每个库生成一个定义。
编译器如何/为什么在两个库中为这些内联函数生成函数和符号?如何强制它停止在我的代码中生成它们?有没有我可以运行的工具来从 .a 文件中删除重复的函数,或者有一种方法可以让链接器忽略多个定义?
(仅供参考,第三方库确实在其所有标头中包含 #ifdef __cplusplus 和 extern "C" 保护;无论如何,如果这是问题,它不会导致符号的多重定义,它会导致相反的问题,因为符号会未定义或至少不同。)
值得注意的是,如果我链接到第三方 C 库的 DLL,则不会发生链接错误;但是,然后我遇到奇怪的运行时故障,这似乎与我的代码有自己的函数版本有关,它应该从 DLL 调用。(好像编译器正在创建我没有要求的函数的本地版本。)
之前有人问过这个问题的类似版本,但是,我没有在以下任何一个中找到我的情况的答案:
这个问题的答案是海报是多重定义变量,我的问题是内联函数的多重定义: Repeated Multiple Definition Errors from include same header in multiple cpps
这是一个 MSVC 程序,但我使用的是 mingw;另外,这个问题中的发帖者的问题是在标题中的类主体之外定义了一个 C++ 类构造函数,而我的问题是内联的 C 函数: 静态库多重定义问题
这个傻瓜将他所有的 C 代码重命名为 C++ 文件,而他的 C 代码不是 C++ 安全的: 链接时对许多 std:: 函数的多重定义
这个只是想知道为什么违反一个定义规则不是错误: 具有不同定义的内联函数的不可预测的行为