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

use*_*636 4 c c++ gcc xcode4

我有以下c ++程序:

Client.h

#ifndef Client_Client_h
#define Client_Client_h

#include "Client.h"

class Client {

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

#endif
Run Code Online (Sandbox Code Playgroud)

Client.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;
}
Run Code Online (Sandbox Code Playgroud)

在XCode 4.3中编译上面给我一个静态库文件,名为:

libClient.a
Run Code Online (Sandbox Code Playgroud)

另外,我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

为了调用f1()和f2(),我需要采取什么步骤?如何使用GCC正确链接静态库?

到目前为止,我尝试过:

gcc -lClient.a main.c 
Run Code Online (Sandbox Code Playgroud)

这给了我:

ld: library not found for -lClient.a
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

zne*_*eak 8

这不会起作用,或者至少不可移植.一个非常明显的事情是使您的程序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;
}
Run Code Online (Sandbox Code Playgroud)

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

void Foo();
Run Code Online (Sandbox Code Playgroud)

你可以打电话给它.

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

就与静态库的链接而言,在Xcode中,转到项目设置,选择目标,转到Build Phases选项卡,展开"Link Binary With Libraries"部分,然后将.a文件放在那里.