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

How do you link a C++ static library to a C program?

本文关键字:链接 程序 静态 C++      更新时间:2023-10-16

我有以下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

另外,我有一个主要的.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("hellon");
        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++函数名被篡改成一团,其中包括它们的参数类型、返回类型和类,看起来像__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文件放在那里。