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

In ref : Linking C compiled static library to C++ Program

本文关键字:静态 链接 程序 C++ 编译 ref      更新时间:2023-10-16

Stackoverflow不允许我发表评论,因为我是新手。

借用此处发布的问题的标题,接受的解决方案说您必须使用#ifdef __cplusplusextern "C"修改 C 头文件 . 我有完全相同的问题,但我得到了一个包含 100 多个.hC 头文件和.cC 程序文件的 C 库,现在我必须使用C++库,所以我的main()将处于C++。

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

编辑此问题已解决。我希望这个问题被关闭或删除。

您不必修改任何标头。需要的是用extern C {}包装所有 C 声明。您也可以在文件中执行此操作cpp

extern "C" {
#include "some_c_header.h"
}
int main() {
std::cout << "This is C++ coden";
}

创建一个头文件可能很有用,该文件仅包含带有 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

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

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