在ref中:将C编译的静态库链接到C ++程序

时间:2018-06-27 18:09:25

标签: c++ c gcc g++

由于我是新手,Stackoverflow不允许我发表评论。

从标题为here的问题中借用标题,已接受的解决方案表明您必须使用#ifdef __cplusplusextern "C"修改C头文件。 我有完全相同的问题,但是我提供了一个C库,其中包含100多个.h C头文件和.c C程序文件,现在我必须使用C ++库,因此我的main()将使用C ++。

那么我现在是否必须将这些修改添加到每个C头文件中,或者还有其他方法吗?我的main().cpp文件中,该文件将使用此C库中的函数。

编辑 这个问题已经解决。我希望这个问题能够解决或取消。

2 个答案:

答案 0 :(得分:3)

您不必修改任何标题。必需使用extern C {}包装所有C声明。您也可以在cpp文件中做到这一点:

extern "C" {
#include "some_c_header.h"
}

int main() {
    std::cout << "This is C++ code\n";
}

创建一个仅包含具有C链接的C头的头文件可能会有用:

// c_header.hpp
#pragma once

#ifdef __cplusplus
extern "C" {
#endif 

#include "c_header_1.h"
#include "c_header_2.h"

#ifdef __cplusplus
}
#endif

// main.cpp
#include "c_header.hpp" // extern "C" {} already handled for you

答案 1 :(得分:1)

只有那些由C ++组件访问的C函数和对象的声明才需要使用C链接声明,并且仅即可。据推测,您的新C ++库从现有C代码访问的内容很少(如果有的话),因此主要的问题是main()(直接)访问的内容。必须使用C链接(向main声明那些函数)。如果事实证明这是一件很重要的事情,那么您可以考虑进行重构以使其更少。

此外,不,您不需要修改现有的头文件。引用您的C库并因此包含其某些标头的C ++文件可以将相关的#include语句包装在extern "C"块中,以解决此问题。

相关问题