我现在正处于连接器天堂。我有一个C库,它只能在Visual C ++中编译(它可能在gcc中工作),如果:
__cplusplus
,这会导致所有声明都包含在extern "C" { }
因此,通过这样做,我有一个名为bsbs.lib
现在,我有一个名为Tester
的C ++项目,它希望在barbar
中声明函数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" {}
中包含不。
解决:
好的,这很奇怪,但我从extern C
中的头文件中删除了bsbs
位,将其编译为C ++项目(即使所有文件都是.c
并删除了{ {1}}定义)并且它有效!看完符号列表后我明白了。一切都被严重除了 __cplusplus
(doh)中所包含的内容,并且它要求一个没有咒语的符号,所以我觉得有些不对劲。
答案 0 :(得分:2)
您的链接中不包含c库中可能存在依赖关系。您所包含的c库是否真的是对DLL的引用?如果是这样的话,有一个名为'depends'的程序会告诉你其他所需的DLL是什么。
答案 1 :(得分:2)
如果你在lib中将它们声明为extern C(这是不必要的,如果你是用C ++调用它们的话),那么它们必须是你标题中的extern C.
答案 2 :(得分:0)
我假设您已添加了链接器引用。 E.g:
#pragma comment(lib, "bsbs.lib")
答案 3 :(得分:0)
可能需要让编译器/链接器组合知道要导出/导入哪些API?如果是这样,我会尝试将相应的__declspec
(例如dllimport
和/或dllexport
)添加到C ++库。
答案 4 :(得分:0)
您的lib文件是否导入任何其他lib文件?您可以将lib文件编译为explicity链接lib文件或隐式。有一种方法可以将lib文件放在一个巨大的球中,另一种方法是将它们作为单独的库,所有这些都需要在最终应用程序的编译时进行链接。如果foofoo是从另一个lib文件导入lib文件中的,那么在最终项目中包含该lib文件。这是我对你描述的内容的最好猜测,也是我在通过同事处理lib文件时最常见的问题。