我已经查看了同一主题的以下两篇帖子: Post1 Post2。我有类似的问题,但不一样(我猜)。所以在这里发布。对不起,如果它仍然是重复的。
我有一个C-static库(libComm.a),它包含以下实现。
comm.h:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
.....
typedef struct _CDef {} CommDef;
我收到了这个文件。无论如何我无法改变它。除此之外,我还有另一个Cpp库(libfw.a):
fw.h:
namespace fw { namespace ipc {
class A { ...... };
} }
我的目标是在我的C ++应用程序中使用这两个库:
myCppApp.cpp
#include "fw.h"
extern "C" {
#include "comm.h"
}
namespace chat { namespace comm {
class CppApplication
{
private:
CommDef def;
fw::ipc::A ipc;
};
}
}
当我想编译它时,编译器找不到“fw :: ipc :: A”。但是,如果我不使用C头和相应的数据类型,一切正常。
我意识到这是因为我所包含的头文件包含标准的C包含文件。所以,我的问题是如何解决这个编译问题,并在最后成功链接到lib,具有以下条件:
非常感谢你的时间。
答案 0 :(得分:2)
问题是C标头用#define
s污染预处理器。一种可能性是使用#undef
:
extern "C" {
#include "comm.h"
}
#undef ipc
// ...
另一个选项是在包含C头之前无法访问的名称中添加别名:
#include "fw.h"
typedef fw::ipc::A fw_ipc_A;
extern "C" {
#include "comm.h"
}
// ...
fw_ipc_A ipc_;