链接到编译为C++的C库

问题描述:

我现在处于链接器天堂。我有一个C库,只有编译在Visual C++(它可能是在海湾合作委员会的工作),如果:链接到编译为C++的C库

  1. 我编译为C++代码
  2. 定义__cplusplus这将导致所有声明被封装在extern "C" { }

所以,这样做我有一个叫,比如静态库,bsbs.lib

现在,我有一个C++项目称为Tester哪想调用函数在bsbs.h中声明的。一切顺利的罚款,直到我尝试,我得到了所有太熟悉的链接到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" {}中。

解决: OK,这是很奇怪的,但我删除从bsbs头文件extern C位,编译它作为一个C++项目(即使所有的文件都.c并删除了__cplusplus定义)和有效!我在看符号列表后看到了这个想法。除之外的所有东西都被毁坏了,其中包含extern C(doh)中的那些,并且它要求一个未折叠的符号,所以我认为有些问题是不对的。

+1

而且您没有在测试器代码中的任何地方引用“_foofoo”? – 2010-06-14 21:13:29

+0

你在第二点意味着什么 - 我认为我们需要看到一些代码,因为这可能是错误的 – Mark 2010-06-14 21:15:05

+1

在你丢失的第三个库中,'foofoo'是否存在,即bsbs.lib'需要别的东西吗? – 2010-06-14 21:16:34

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

+0

但不是在'Tester'的C++头文件中,对吧? – Jacob 2010-06-14 22:43:33

+0

如果他们是外部C,他们是外部C.你不能混合和匹配。如果lib将它们作为extern C导出,那么你必须将它们作为extern C导入它们。 – Puppy 2010-06-14 22:47:12

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

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

嗯,我在其他地方定义了输入库,所以它读取'bsbs.lib' – Jacob 2010-06-14 22:41:53

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

+0

我不这么认为,因为'foofoo'是在'bs​​bs.lib'中定义的,它似乎是独立的。 – Jacob 2010-06-14 22:40:12

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

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

+0

我不认为是这种情况,因为'foofoo'似乎完全定义了。 – Jacob 2010-06-14 22:42:59