c++ - 如何将独立的 c 应用程序组合成 c++ 应用程序?
问题描述
我正在开发一个 C++ 应用程序(称为它recorder.cpp
),其中包括来自其他地方的一些 C++ 库(必须使用 c++14,所以我被困在这方面)。目前我的应用程序正在运行,但它只是基于外部库和命令行参数进行配置。
有一个单独的 C 应用程序(称为它receiver.c
)独立工作,我基本上想与recorder
. 我认为最简单的方法是将所有内容复制并粘贴receiver
到中recorder
,但这似乎有点多余(更不用说如果我receiver
将来制作模组,我将需要在 中进行相同的更改recorder
)。所以我试图弄清楚是否有办法链接它们,以便我可以receiver
从recorder
应用程序中调用。我知道我不能只调用receiver
'main(),但我不确定是否有一种方法可以构建receiver
,使其更像一个库,但仍然可以构建为它的独立应用程序。
解决方案
“......我试图弄清楚是否有办法将它们链接起来,以便我可以从录音机应用程序呼叫接收者。”
是的 - 但更简单、更直接的方法是使用 C++ 代码复制reciever.c
代码(减去其main()
功能)。这将要求C
代码中没有违反C++
规则的语法。(例如,malloc()
在 C++ 中需要转换 for example 的返回值,但在 C 中不建议这样做。)但是因为大多数 C 语法是完全C++
兼容的,所以应该很少或不需要修改。现在你所有的代码都在一起了,可以简单地编译为C++
.
然而,链接方法需要编译您的独立程序的所有函数(同样,将main()
函数留在库中。例如 DLL 或共享库。可以使用 extern "C" { ... } within the
C++ 头文件链接该库以包围C
函数原型在库文件中定义的C
。环绕中的那些函数将使用C
链接而不是编译C++
。一个简单的例子:
// C++ code
extern "C" void f(int); // one way
extern "C" { // another way
int g(double);
double h();
};
void code(int i, double d)
{
f(i);
int ii = g(d);
double dd = h();
// ...
}
请注意,链接中包含以下语句:“...此外,您需要阅读本节的其余部分以了解如何使您的 C 函数可被 C++ 调用和/或您的 C++ 函数可被 C 调用。”
编辑从评论中添加信息:
关于创建库。然后,两个程序都可以使用该库,而不是在两个地方进行维护。这将使版本控制复杂化,并且如果两个程序在未来出现分歧,则可能会出现未来问题。另请注意,也可以使用静态库而不是共享库。随着未来变化的发生,这些方法具有不同的版本控制含义。(来自@Avi Berger)
...或者,如果您的意图是拥有一个通用的 *.c 文件,以便对一个应用程序所做的更改很容易包含在另一个应用程序中,那么您无需创建库,而只需在 .o 文件中进行链接。(来自@Goswin von Brederlow)
推荐阅读
- java - 将命名空间前缀“ns2”更改为“urn”并将名称规范放入根元素
- docker - 创建卷的 Docker 容器后,本地主机上的权限更改为 1000
- powershell - 无法更改 powershell 4 中的属性
- c# - 递归调用快速排序算法
- node.js - 迁移时出现 PG 客户端错误的 Knex
- javascript - 在angularjs中读取CSS文件
- powerbi - DAX 用户关系函数
- botframework - MSBot 在打开机器人时没有响应。未收到欢迎消息
- javascript - Webpack 加载器顺序
- java - Java 8 和 11 之间的流差异