【发布时间】:2023-04-01 11:03:01
【问题描述】:
我现在在链接器天堂。如果:
- 我将其编译为 C++ 代码
- 定义
__cplusplus,这将导致所有声明都包含在extern "C" { }中
因此,通过这样做,我有一个名为 bsbs.lib 的静态库
现在,我有一个名为 Tester 的 C++ 项目,它想调用在 bsbs.h 中声明的函数 barbar。一切都很好,直到我尝试链接到bsbs.lib,在那里我得到了非常熟悉的:
Tester.obj : error LNK2001: unresolved external symbol _foofoo
它似乎总是foofoo,无论我在Tester(barbar 或其他任何东西)中调用哪个函数,都无法解决。
更新:我已按要求扩展了第 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