如何将 C++ 静态库链接到 C 程序?

2024-02-29

我有以下 C++ 程序:

Client.h

#ifndef Client_Client_h
#define Client_Client_h

#include "Client.h"

class Client {

public:
    void f1();
    void f2();
};

#endif

客户端.cpp

#include <iostream>
#include <stdlib.h>
using namespace std;

#include "Client.h"

void Client::f1(){
    cout << "Client.f1()" << endl;
}

void Client::f2() {
    cout << "Client.f2()" << endl;
}

在 XCode 4.3 中编译上面的代码会得到一个静态库文件,名为:

libClient.a

另外,我有一个 main.c

#include <stdio.h>
//
//using namespace std;

int main(){
        // how do I do something like: Client c; c.f1(); c.f2(); 
        // and actually get output ? 
        printf("hello\n");
        return 0;
}

我需要采取哪些步骤才能调用 f1() 和 f2() ?如何使用GCC正确链接静态库?

到目前为止我已经尝试过:

gcc -lClient.a main.c 

这给了我:

ld: library not found for -lClient.a
collect2: ld returned 1 exit status

这是行不通的,或者至少是不可移植的。唯一的那个真的真的显而易见的事情就是让你的程序成为 C++,这样你就可以访问这些功能。

出于显而易见的原因,您不能“本地”使用 C 代码中的 C++ 代码。您无法访问面向对象的功能,因此大量的东西将无法工作:构造函数、析构函数、移动/复制语义和虚拟继承可能是您会错过的最重要的东西。 (没错:您将无法正确创建或销毁对象,除非它们具有简单的构造函数和析构函数。)

您还会遇到链接问题:C++ 函数名称是mangled http://en.wikipedia.org/wiki/Name_mangling陷入混乱,包括它们的参数类型和返回类型和类,看起来像__1cGstrcpy6Fpcpkc_0_。这将是技术上可行声明 C 中函数的重整名称以使用它们,或者使用dlsym获取指向它们的指针,但这很愚蠢。不要那样做。

如果您需要创建一个function在 C++ 中,需要从 C 调用,您可以将其指定为extern "C"它的名称不会被破坏,并且可以从 C 访问,并且它本身能够使用 C++ 功能:

extern "C" void Foo()
{
    std::string hello = "Hello world!";
    std::cout << hello << std::endl;
}

然后,您需要在程序的 C 端声明它,如下所示:

void Foo();

你就可以调用它了。

您可以将想要公开给 C 程序的所有 C++ 调用包装在extern "C"函数,并返回一个指向您的类型的指针并以这种方式处理它,但它很快就会变得烦人。你真的应该只使用 C++。

就与静态库的链接而言,在 Xcode 中,转到项目设置,选择目标,转到“构建阶段”选项卡,展开“链接二进制文件与库”部分,然后将 .a 文件放在那里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 C++ 静态库链接到 C 程序? 的相关文章

随机推荐

  • 如何使用 os.walk() 在 Python 中处理 OSX 别名?

    我正在使用 Python 2 7 x 遍历目录树 并在遍历时获取文件和目录的大小 我遇到的问题是 它将别名文件误认为是目录 然后抛出 没有这样的文件或目录 的错误 代码如下 def get size start path total siz
  • 由于使用“it”而产生的不明确类型变量“a0”

    我有以下函数返回给定数字的因子对 factorPairs RealFrac a Floating a Integral a gt a gt a a factorPairs n map x gt x div n x y y lt 1 ceil
  • Pandas:如何获取列的位置?

    我需要帮助来获取列的位置或以其他方式在列中读取列左侧两步Spannung Exceldata pd read excel str Dateien 0 header 2 print Dateien 0 Spannung Exceldata c
  • 如何从视图查询数据库 - CodeIgniter

    我有在控制器中运行的查询 data query this gt Member gt select sql id this gt load gt view myform 然后在视图中输出数据 foreach query gt result a
  • 使用 powershell 的 Azure Devops 审核 REST API 延续令牌

    我正在编写脚本 该脚本应在 csv 文件中为选定字段输出审核日志报告 由于 REST API 结果限制 我无法一次获取所有数据 如果我手动传递延续令牌 我可以获取下一组数据 但我希望脚本生成给定时间范围内的所有日志 我尝试了这个脚本 它不返
  • tkinter 的 .pack_propagate() 方法

    我正在尝试 Tkinter 因为我试图弄清楚是否有一种方法可以在不使用画布的情况下设置 tkinter 的窗口大小 我发现了这个如何关于 SO 问答的设置帧大小问题 https stackoverflow com questions 563
  • 使用通配符时,Javac 无法找到符号,但在手动指定 .java 文件时可以正常工作

    当我用这个编译器代码进行编译时 echo off javac d bin sourcepath src java src sign java src Alert java pause 我没有收到任何错误 但是当我用这段代码编译时 echo
  • JSplitPane 中分隔线移动的动画

    在我的代码中 UI 具有以下组件 JSplitPane pane1 JTable pane2 JPanel with some texutal information 我正在侦听表上的行选择事件 然后适当地设置分割窗格的分隔符位置 以便文本
  • 如何在我的 App.js 视图中导入和使用此文件

    我想将其导入到我的 React Native 项目 App Js vue 中 我尝试了很多方法 但它不起作用 我的意思是我想在我的视图中渲染它 我如何导入并在我的 Appjs 中显示此文件 谁能帮助我 这对我来说非常重要 这是我的代码 im
  • UIScrollView contentInset 属性有什么用?

    有人可以向我解释一下是什么吗contentInset财产在一个UIScrollView实例是用来做什么的 也许提供一个例子 它设置内容视图和封闭滚动视图之间的插图距离 Obj C aScrollView contentInset UIEdg
  • 解决 celerybeat 的单点故障问题

    我正在寻找推荐的解决方案来解决 celerybeat 成为 celery rabbitmq 部署的单点故障的问题 到目前为止 通过搜索网络 我没有找到任何有意义的东西 就我而言 定时调度程序每天启动一次可以运行半天或更长时间的一系列作业 由
  • contentView 在 iOS 6 UITableViewCell 原型单元格中不缩进

    我正在配置自定义UITableViewCell在故事板中使用原型单元 然而 所有的UILabels 和其他 UI 元素 似乎没有添加到单元格的contentView 而不是添加到UITableViewCell直接查看 当单元格进入编辑模式时
  • Chrome iframe 父级未定义

    我有这个 Gmail 脚本 它运行在canvas frame iframe 我想使用父文档的句柄parent document 但在 Chrome 中告诉我它是未定义的 在 Firefox 中工作正常 但在 Chrome 上就崩溃了 那么
  • 在SceneKit中,SCNLightTypeAmbient类型的SCNLight是否会忽略categoryBitMask参数?

    看来是啊 这里 categoryBitMask 被忽略 ambientLight SCNLight light ambientLight color UIColor colorWithRed 0 994 green 0 715 blue 0
  • iTunes 有哪些脚本目标?

    苹果有一个很好的文档技术问答页面 https developer apple com library mac qa qa1802 index html用于实现 Mail app 的脚本目标 然而 尽管脚本目标也适用于 iTunes 但没有可
  • 静态方法和扩展方法同名

    我创建了扩展方法 public static class XDecimal public static decimal Floor this decimal value int precision decimal step decimal
  • Vue2 在通过 Axios 接收的列表中搜索

    由于过滤比 Vue 1 中的过滤要复杂得多 所以我有一个问题 这是我的组件 其中显示了羊列表 并提供了搜索 过滤名称或家族的选项 但我不知道如何实现这一目标
  • 如何将配置变量发送到 py.test 测试?

    我有一个测试套件需要与多个后端一起运行 但这不是一个简单的参数化测试 因为它适用于整个套件 多个文件 模块 我可以通过环境控制运行 但我想知道 py test 是否有更清晰的方式来表达这一点 也就是说 我正在寻找这样的东西 py test
  • 如何将 hasOne 关系与嵌入的always关系建立起来

    EmberJS 在早期版本中删除了 hasOne 在我想要 hasOne 的地方创建这样的嵌套对象关系的方法是什么 已经删除了 hasOne 以支持 ownTo 任何人都可以分享一下如何在嵌套 JSON 之间编写 embedded alwa
  • 如何将 C++ 静态库链接到 C 程序?

    我有以下 C 程序 Client h ifndef Client Client h define Client Client h include Client h class Client public void f1 void f2 en