【问题标题】:Linking to a C library compiled as C++链接到编译为 C++ 的 C 库
【发布时间】:2023-04-01 11:03:01
【问题描述】:

我现在在链接器天堂。如果:

  1. 我将其编译为 C++ 代码
  2. 定义__cplusplus,这将导致所有声明都包含在extern "C" { }

因此,通过这样做,我有一个名为 bsbs.lib 的静态库

现在,我有一个名为 Tester 的 C++ 项目,它想调用在 bsbs.h 中声明的函数 barbar。一切都很好,直到我尝试链接到bsbs.lib,在那里我得到了非常熟悉的:

Tester.obj : error LNK2001: unresolved external symbol _foofoo

它似乎总是foofoo,无论我在Testerbarbar 或其他任何东西)中调用哪个函数,都无法解决。

更新:我已按要求扩展了第 2 点。非常感谢大家的帮助!

#ifndef _BSBS_H
#define _BSBS_H

/* Prevent C++ programs from name mangling these definitions. */
#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <setjmp.h>
.......
.......
#ifdef __cplusplus
}
#endif

#endif /* _BSBS_H */

这是“主要”头文件,可以这么说。所有重要的功能都在这里。但是bsbs.c文件调用的其他头文件包含在extern "C" {}中。

已解决: 好的,这很奇怪,但是我从 bsbs 的头文件中删除了 extern C 位,将其编译为 C++ 项目(即使所有文件都是 .c 并删除了 __cplusplus 定义)并且它工作!我在查看符号列表后得到了这个想法。一切都被破坏了除了包含在extern C(doh)中的那些,它要求一个未破坏的符号,所以我认为有些不对劲。

【问题讨论】:

  • 你没有在测试代码的任何地方引用“_foofoo”?
  • 您在第 2 点中到底是什么意思 - 我认为我们需要查看一些代码,因为这可能是错误的
  • foofoo 是否在您丢失的第三个库中,即 bsbs.lib 是否需要其他内容?
  • “在 VC 中编译(它可能在 gcc 中工作)”中显示的童年天真和天真让我哈哈大笑
  • 为什么不把C库编译成C代码呢?而且您不应该在任何地方定义__cplusplus - 这取决于实现。

标签: c++ c visual-c++ linker static-libraries


【解决方案1】:

如果您在 lib 中将它们声明为 extern C(如果您从 C++ 中调用它们,这是不必要的),那么它们在您的标头中必须是 extern C。

【讨论】:

  • 如果它们是外部 C,它们就是外部 C。你不能混搭。如果 lib 将它们导出为 extern C,那么您必须将它们导入为 extern C。
【解决方案2】:

在您的链接中未包含的 c 库中可能存在依赖项。您包含的 c 库是否真的是对 DLL 的引用?如果是这样,有一个名为“depends”的程序会告诉您其他所需的 DLL 是什么。

【讨论】:

  • 我不这么认为,因为foofoo是在bsbs.lib中定义的,而且似乎是独立的。
【解决方案3】:

我假设您已经添加了链接器引用。例如:

#pragma comment(lib, "bsbs.lib")

【讨论】:

  • 好吧,我在别处定义了输入库,所以它的读数是bsbs.lib
【解决方案4】:

也许需要让编译器/链接器组合知道要导出/导入哪些 API?如果是这样,我会尝试将适当的__declspec(例如,dllimport 和/或dllexport)添加到 C++ 库中。

【讨论】:

    【解决方案5】:

    您的 lib 文件是否导入任何其他 lib 文件?您可以编译 lib 文件以显式链接 lib 文件或隐式链接。一种方法是把 lib 文件放在一个大球中,另一种方法是把它们作为单独的 lib,所有这些都需要在最终应用程序的编译时链接。如果 foofoo 从另一个 lib 文件导入到您的 lib 文件中,则将该 lib 文件包含在您的最终项目中。这是我根据你描述的最好的猜测,也是迄今为止我通过同事处理 lib 文件时被问到的最常见的事情。

    【讨论】:

    • 我不认为是这样,因为foofoo 似乎已经完全定义了。
    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多