【问题标题】:How to use the Boost libraries in a C program如何在 C 程序中使用 Boost 库
【发布时间】:2021-08-02 20:09:36
【问题描述】:

我正在开发一个用 C 语言编写的项目,但我想使用 Boost。我在我的主文件中包含了 Boost 库,如下所示:

#define GNU_SOURCE
#define _GNU_SOURCE
#include <stdlib.h>
#include "initialize.h"
#include <stdio.h>
#include <math.h>
#include <boost/random/linear_congruential.hpp>

我正在使用gcc -W -Wall -I/usr/local/boost_1_76_0 main.c -o executable -lm -lboost_random进行编译。

main.c:8:10: fatal error: iostream: No such file or directory
    8 | #include <iostream>

我猜 Boost 库正在使用 &lt;iostream&gt;,但由于它不是 C 库,我不知道如何处理这个问题...我应该用 C++ 编译吗?

【问题讨论】:

  • 使用 C++ 作为“C with boost”?
  • 您想要通用解决方案还是只需要LCG
  • @AyxanHaqverdili 你到底是什么意思?
  • @pulsar_hh 我添加了一个答案来解释
  • 您可以为函数争吵 C 链接:extern "c" {...} - 但您需要使用 C++ 编译接口代码。

标签: c++ c gcc boost


【解决方案1】:

Boost 仅适用于 C++。即使它的某些部分使用 C 编译器编译,也不能保证总是如此。

一种方法是使用 Boost 在 C++ 中构建一个 dll / so,使用 C 风格的链接导出函数。

然后使用 C 链接到该库。

【讨论】:

    【解决方案2】:

    Boost 在很大程度上是一个 C++ 库,因此不能在 C 程序中使用。

    如果要使用 Boost,则需要使用 C++。

    【讨论】:

      【解决方案3】:

      您的 C 项目可能使用 C++ 编译器编译得很好。使用 C++ 编译器,然后您就可以访问 Boost 和所有其他 C++ 库。这就是 C++ 最初设计用来处理的那种转换。

      【讨论】:

      • 这种方法肯定有优点,因此值得一看。投赞成票。
      • 我试过但得到一个错误,如错误:从'void*'到'double*'的无效转换[-fpermissive] 16 |部分->Pinit = malloc(sizeof(*part->Pinit) * 2500);
      • @pulsar_hh:是的,您需要在 C++ 中将 malloc 投射到右侧。 (您也可以在 C 中执行此操作,但它是不必要的,并且有时是有害的。)
      • @pulsar_hh 你需要转换malloc 的结果。那是您必须更改的唯一一件事。如果您希望它是有效的 C 和 C++,则可以使用 C 样式转换。
      • @Bathsheba 在哪些方面有害?如果您使用适当的警告,我怀疑这会搞砸任何事情。
      【解决方案4】:

      Boost 不能与 C 一起使用,因为它使用 C++ 的 OOP 功能。 可能为它开发一个包装器在技术上是可行的。检查Developing C wrapper API for Object-Oriented C++ code

      Boost 非常面向 C++,并且无法保证即使这样也能正常工作。在 C 中使用 Boost 确实没有意义。首先,因为 Boost 主要用于“增强” OOP(以及其他实用程序),其次是因为,为什么不使用 C++?它们非常相似,您可以将 C 标准库与 C++ 一起使用,也可以将 procedural programming 与 C++ 一起使用。所以,你最好将 C++ 与 C 标准库一起使用(但我不能保证它会完美地工作)并且不要使用 C++ 的 OOP 特性。

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 2013-06-15
        • 2011-04-27
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多