gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:49 25 4
gpt4 key购买 nike

我有以下 C++ 程序:

客户端.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变成一团乱麻,包括它们的参数类型和返回类型和类,看起来像 __1cGstrcpy6Fpcpkc_0_技术上可行 在 C 中声明函数的损坏名称以使用它们,或者使用 dlsym 获取指向它们的指针,但这很愚蠢。不要那样做。

如果您需要在 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 文件那里。

关于c++ - 如何将 C++ 静态库链接到 C 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18394801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com