在 ref 中:将 C 编译的静态库链接到C++程序
In ref : Linking C compiled static library to C++ Program
Stackoverflow不允许我发表评论,因为我是新手。
借用此处发布的问题的标题,接受的解决方案说您必须使用#ifdef __cplusplus
和extern "C"
修改 C 头文件 . 我有完全相同的问题,但我得到了一个包含 100 多个.h
C 头文件和.c
C 程序文件的 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"
块来处理该问题。
相关文章:
- 基于boost的程序的静态链接——zlib问题
- 使用gcc从静态链接的文件中查找可选符号
- 使用转换器提升 Python 问题 - 静态链接
- C++实用程序::转换在静态链接库中不起作用
- 将源中的 GLEW 与 cmake 静态链接
- 在发布模式下启动使用库的静态链接编译的应用程序时出错
- libavdevice 和 x11 的静态链接库应该以什么顺序链接?
- 静态链接启用 PIC 的库时出现链接器 PIC 错误
- 静态链接库时,收到链接器错误:找不到 -lgcc_s
- 静态链接 glibc & boost_python36 for Python extension
- 我可以在C++中配置静态链接吗?
- 协议缓冲区的静态链接会导致与现有符号冲突
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 静态链接 Visual Studio dll 到动态链接的 sfml 项目
- 我可以加载与库静态链接的 dll 吗?
- 静态链接MSVC库,动态链接Qt
- C++:找不到静态链接
- OpenSSL AES仅适用于某些计算机,即使具有静态链接也是如此
- CURL 静态链接未解析的外部符号
- 如何强制Windows.h在Visual Studio中静态链接而不是动态链接?