【问题标题】:In ref : Linking C compiled static library to C++ Program参考文献:将 C 编译的静态库链接到 C++ 程序
【发布时间】:2018-06-27 18:09:24
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ c gcc g++


    【解决方案1】:

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

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

    创建一个简单地包含带有 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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2012-02-15
        相关资源
        最近更新 更多