【发布时间】:2014-05-13 08:27:49
【问题描述】:
我有一个需要在 C++ 代码中使用的 C 库,所以我需要用 extern "C" 块包装整个库。问题是该库似乎包含 C++ 编译代码,因此包装整个库也会包装该 C++ 标头。
在lib.h 中,我只包含我想要公开的所有内部标头,如下所示:
#ifndef LIB_H
#define LIB_H
#include "lib_foo.h"
#include "lib_bar.h"
#include "lib_baz.h"
#endif
因此客户端只需要包含lib.h 即可使用该库。
在我的第一次尝试中,我已经这样做了:
#ifndef LIB_H
#define LIB_H
extern "C" {
#include "lib_foo.h"
#include "lib_bar.h"
#include "lib_baz.h"
}
#endif
但是当我在already_compiled_c++.h 中执行任何函数时,我得到一个符号查找错误。
如何避免在already_compiled_c++.h 头文件中应用extern "C"?
编辑:
解决了。这不是使用extern "C" 的问题,而是正确链接已编译的c++ 库和gyp 的问题:Using shared library in Gyp in node-sqlite3
【问题讨论】:
-
此类问题通常表明您使用的 C 库缺乏良好的设计。您能否编辑
lib_*.h文件并用extern "C"而不是#include "already_compilerd_c++.h"包围这些标识符?您也可以将此作为补丁发送给 C lib 的原作者。 -
是的,这就是我所做的,但现在我收到一个错误:
error: expected identifier or ‘(’ before string constant。我只是将原型包装在头文件中。 -
.h文件如何“已编译”? -
@MattMcNabb 编译成.so文件。
标签: c++ c compiler-construction name-mangling