块来包装整个LIB。问题是库似乎包含了C++编译代码,因此包装整个LIB也会包装C++头。,c++,c,compiler-construction,name-mangling,C++,C,Compiler Construction,Name Mangling" /> 块来包装整个LIB。问题是库似乎包含了C++编译代码,因此包装整个LIB也会包装C++头。,c++,c,compiler-construction,name-mangling,C++,C,Compiler Construction,Name Mangling" />

用extern“包装C库;";除了内部C++;包括 我有一个C库,我需要在C++代码中使用,所以我需要用一个外部的“C”< /C>块来包装整个LIB。问题是库似乎包含了C++编译代码,因此包装整个LIB也会包装C++头。

用extern“包装C库;";除了内部C++;包括 我有一个C库,我需要在C++代码中使用,所以我需要用一个外部的“C”< /C>块来包装整个LIB。问题是库似乎包含了C++编译代码,因此包装整个LIB也会包装C++头。,c++,c,compiler-construction,name-mangling,C++,C,Compiler Construction,Name Mangling,在lib.hI中,我只包含我想要公开的所有内部头,类似这样: #ifndef LIB_H #define LIB_H #include "lib_foo.h" #include "lib_bar.h" #include "lib_baz.h" #endif 因此,客户端只需包含lib.h即可使用lib 在我的第一次尝试中,我做到了: #ifndef LIB_H #define LIB_H extern "C" { #include "lib_foo.h" #include "li

lib.h
I中,我只包含我想要公开的所有内部头,类似这样:

#ifndef LIB_H
#define LIB_H

#include "lib_foo.h"
#include "lib_bar.h"
#include "lib_baz.h"

#endif
因此,客户端只需包含
lib.h
即可使用lib

在我的第一次尝试中,我做到了:

#ifndef LIB_H
#define LIB_H

extern "C" {
  #include "lib_foo.h"
  #include "lib_bar.h"
  #include "lib_baz.h"
}

#endif
但是,当我在
已经编译的
中执行任何函数时,就会出现符号查找错误

如何避免在
已编译的
头文件中应用
extern“C”


编辑:


解决了。这不是使用代码>外部“C”<代码>的问题,这是一个问题,编译的C++库与GYP链接正确:

注意: ExtCnc/Cuth>不是合法C,因此必须只包含作为C++编写。 已经编译的_c++.h头可能包含防止多个包含的保护,因此只需先包含它:

#ifndef LIB_H
#define LIB_H

# This include added so that it won't get marked extern "C" when included by lob_foo.h.
#include <already_compiled_c++.h>

#ifdef __cplusplus
extern "C" {
#endif

  #include "lib_foo.h"
  #include "lib_bar.h"
  #include "lib_baz.h"

#ifdef __cplusplus
}
#endif

#endif
#ifndef LIB#H
#定义LIB_H
#添加此include是为了在被lob_foo.h包含时不会将其标记为extern“C”。
#包括
#ifdef_uucplusplus
外部“C”{
#恩迪夫
#包括“lib_foo.h”
#包括“lib_bar.h”
#包括“lib_baz.h”
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫

注释:需要检查<代码> AdRead yCuffiel.C++.H./C>是否有条件地包含并添加相应的条件句。

< P>不能从在C.C.P/>编译的文件中调用C++。 如果lib_foo.h是纯C,则它不能直接使用已编译的_C++.h中的函数。您很可能需要为它创建一个C包装器


这个答案可能会进一步帮助你:

如果你的图表是准确的,那么
lib_foo.h
不应该包括
已经编译的
。编辑它以停止包含该内容

如果在<代码>中声明的函数ALLRADYYXCOMPILDEXOL+C++ .H./COD>将它们的实现编译为使用C++ ABI,则无法使C程序与它们链接。(除了极其丑陋的黑客攻击)

为了避免将来的这种咆哮,在每个C++文件头文件中明确地提出了“代码”>“IFDEF”、“CPLUPLUS < /COD> <代码>外”“C”{ /COD>保护,但可以在C++程序中使用,反之亦然。


针对您当前情况的一种解决方法是制作一个
.cpp
文件,该文件包含您所需函数的thunk。将thunk发布在
外部“C”下<代码>,通过调用C++中的函数来实现这些功能。

1)尽管“ExtLeNe”C’后面的原始思想是由C++文件的C头文件组成的,但是如果你有C应该可访问但却在C++中实现的头文件,那么常用的方法是将声明包在其中而不是包含。(使用必需的#ifdef uu cplusplus,因此总是将头视为C的C代码不会被不必要的C++-ism“extern“C”阻塞)

2)不要将C++作为公共API暴露出来。C++一般不提供二进制稳定的ABI。如果添加了一个方法,而不是在结尾,或者如果向一个类添加实例变量,或者如果在模板化的类中更改了某个对象,则所有的客户端都必须重新编译。(静态库通常都会发生,但这对于DyLIb/DLL/框架来说是个大问题)。因此,通常最好的办法是将C++保持为实现细节,只从库中公开C特性。

3)如果需要从库中公开C++,使用PIML(私有实现)模式和模板,将其放置在主C头不包含的单独的头中,因此C客户端不能仅包含它。这样的单独的头也对Y 2有用,因为库的模块的实现文件(C++中)可以包含它,从而使用其中的类

4)C++中,指向结构FoO的指针和指向类FO的指针是相同的。因此,如果需要从C++中实现的C++ API返回C++类,那么您可以做的就是在头文件中总是使用StultFo*(C正确理解),并且为类方法提供C包装函数,例如:

extern "C" int FooGetCount( struct Foo* thisFoo )
{
    return thisFoo->GetCount();
}

这样,他们可以保持指向C++对象的指针,访问它们的属性,但不需要实际使用C++。当然,还需要提供类似的包装来创建/删除对象,因为C没有新的/删除操作符。

这些问题经常表明您使用的C LIB缺少良好的设计。
lib_*.h
文件,并用
extern“C”
包围这些标识符,而不是
。\35;包括“ready_compiler_C++.h”
?您也可以将其作为补丁发送给C库的原始作者。是的,这是我所做的,但现在我得到一个错误:
错误:预期标识符或(在字符串常量之前)。我只是简单地把头文件包装在原型文件中。如何<代码> .h < /C>文件“已经编译”?@ MattMcNabb是在.so文件中编译的。实际上,C++标题的内容是:<代码>包含了< /代码>。我将接受这个答案,因为我还必须把所有的包括起来。