C++ 链接到编译为C++;
我现在在链接器天堂。我有一个C++库,它只在Visual C++中编译(如果在/gp>中工作): 我把它编译成C++代码< /LI>C++ 链接到编译为C++;,c++,c,visual-c++,linker,static-libraries,C++,C,Visual C++,Linker,Static Libraries,我现在在链接器天堂。我有一个C++库,它只在Visual C++中编译(如果在/gp>中工作): 我把它编译成C++代码< /LI> 定义\uuucplusplus,这将导致所有声明都包含在extern“C”{} 因此,通过这样做,我有了一个静态库,比如说,bsbs.lib 现在,我有一个C++项目叫做“代码>测试者< /COD>,它想调用函数 BabBar < /C> >在代码< BSBS.H./Cube >中声明。一切都很顺利,直到我尝试链接到bsbs.lib,在那里我得到了非常熟悉的: T
\uuucplusplus
,这将导致所有声明都包含在extern“C”{}
bsbs.lib
<>现在,我有一个C++项目叫做“代码>测试者< /COD>,它想调用函数<代码> BabBar < /C> >在代码< BSBS.H./Cube >中声明。一切都很顺利,直到我尝试链接到bsbs.lib
,在那里我得到了非常熟悉的:
Tester.obj : error LNK2001: unresolved external symbol _foofoo
无论我在Tester
中调用哪个函数(barbar
或其他任何函数),它似乎总是foooo
无法解决
更新:我已根据要求扩展了第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 */
\ifndef\u BSBS\u H
#定义
*防止C++程序从名称中修改这些定义。*
#ifdef_uucplusplus
外部“C”{
#恩迪夫
#包括
#包括
.......
.......
#ifdef_uucplusplus
}
#恩迪夫
#endif/*_BSBS_H*/
可以说,这是“主”头文件。所有重要的功能都在这里。但是还有其他由bsbs.c
文件调用的头文件,它们不是extern“c{}
中包含的头文件
已解决:
好的,这很奇怪,但是我从代码中删除了<代码>外部c>代码>位,在代码> BSBS中编译成C++项目(即使所有文件都是代码> C.<代码>,并删除了<代码>我在看了符号列表后有了这个想法。除了
extern C
(doh)中包含的那些之外,所有的东西都被弄坏了,它要求一个未混合的符号,所以我认为有些地方不对劲。我假设您添加了链接器引用。例如:
#pragma comment(lib, "bsbs.lib")
链接中可能没有包含c库中的依赖项。您包含的c库是否真的是对DLL的引用?如果是这样,则有一个名为“depends”的程序将告诉您其他所需的DLL是什么。也许编译器/链接器组合需要知道要导出/导入哪些API?如果是这样,我会尝试在C++库中添加适当的代码(例如,
foooo
,即bsbs.lib
可能还需要其他东西?在“在VC中编译(它可能在gcc中工作)”中显示的童年天真和天真真的让我很开心为什么不把C库编译成C代码呢?你不应该在任何地方定义\uuucplusplus
,这取决于实现。我不这么认为,因为foooo
是在bsbs.lib
中定义的,它似乎是独立的。嗯,我在别处定义了输入库,所以它读的是bsbs.lib
,我不认为是这样,因为foooo
似乎是完全定义的。如果它们是外部C,它们就是外部C。你不能混搭。如果lib将它们导出为extern C,那么您必须将它们导入为extern C。