首页 > 解决方案 > 如何将独立的 c 应用程序组合成 c++ 应用程序?

问题描述

我正在开发一个 C++ 应用程序(称为它recorder.cpp),其中包括来自其他地方的一些 C++ 库(必须使用 c++14,所以我被困在这方面)。目前我的应用程序正在运行,但它只是基于外部库和命令行参数进行配置。

有一个单独的 C 应用程序(称为它receiver.c)独立工作,我基本上想与recorder. 我认为最简单的方法是将所有内容复制并粘贴receiver到中recorder,但这似乎有点多余(更不用说如果我receiver将来制作模组,我将需要在 中进行相同的更改recorder)。所以我试图弄清楚是否有办法链接它们,以便我可以receiverrecorder应用程序中调用。我知道我不能只调用receiver'main(),但我不确定是否有一种方法可以构建receiver,使其更像一个库,但仍然可以构建为它的独立应用程序。

标签: c++cmakefilelinker

解决方案


“......我试图弄清楚是否有办法将它们链接起来,以便我可以从录音机应用程序呼叫接收者。”

是的 - 但更简单、更直接的方法是使用 C++ 代码复制reciever.c代码(减去其main()功能)。这将要求C代码中没有违反C++规则的语法。(例如,malloc()在 C++ 中需要转换 for example 的返回值,但在 C 中不建议这样做。)但是因为大多数 C 语法是完全C++兼容的,所以应该很少或不需要修改。现在你所有的代码都在一起了,可以简单地编译为C++.

然而,链接方法需要编译您的独立程序的所有函数(同样,将main()函数留在库中。例如 DLL 或共享库。可以使用 extern "C" { ... } within theC++ 头文件链接该库以包围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)


推荐阅读