链接到编译为C++的C库
我现在处于链接器天堂。我有一个C库,只有编译在Visual C++(它可能是在海湾合作委员会的工作),如果:链接到编译为C++的C库
- 我编译为C++代码
- 定义
__cplusplus
这将导致所有声明被封装在extern "C" { }
所以,这样做我有一个叫,比如静态库,bsbs.lib
现在,我有一个C++项目称为Tester
哪想调用函数在bsbs.h
中声明的。一切顺利的罚款,直到我尝试,我得到了所有太熟悉的链接到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" {}
中。
解决: OK,这是很奇怪的,但我删除从bsbs
头文件extern C
位,编译它作为一个C++项目(即使所有的文件都.c
并删除了__cplusplus
定义)和有效!我在看符号列表后看到了这个想法。除之外的所有东西都被毁坏了,其中包含extern C
(doh)中的那些,并且它要求一个未折叠的符号,所以我认为有些问题是不对的。
我假设你已经添加了一个链接器引用。例如:
#pragma comment(lib, "bsbs.lib")
嗯,我在其他地方定义了输入库,所以它读取'bsbs.lib' – Jacob 2010-06-14 22:41:53
在链接中可能不存在c库中的依赖项。您所包含的c库是否真的包含对DLL的引用?如果是这样,有一个名为'depends'的程序,它会告诉你其他所需的DLL是什么。
我不这么认为,因为'foofoo'是在'bsbs.lib'中定义的,它似乎是独立的。 – Jacob 2010-06-14 22:40:12
您的lib文件是否导入任何其他lib文件?你可以编译一个lib文件来显式链接lib文件或隐式地。一种方法是将lib文件放在一个巨大的球中,另一种方式是将它们作为单独的库,在编译时在最终应用程序中都需要链接。如果foofoo从另一个lib文件导入到lib文件中,那么将该lib文件包含在最终项目中。这是我所描述的最好的猜测,也是迄今为止我在通过同事处理lib文件时被问到的最常见的事情。
我不认为是这种情况,因为'foofoo'似乎完全定义了。 – Jacob 2010-06-14 22:42:59
而且您没有在测试器代码中的任何地方引用“_foofoo”? – 2010-06-14 21:13:29
你在第二点意味着什么 - 我认为我们需要看到一些代码,因为这可能是错误的 – Mark 2010-06-14 21:15:05
在你丢失的第三个库中,'foofoo'是否存在,即bsbs.lib'需要别的东西吗? – 2010-06-14 21:16:34