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

我有以下c ++程序:

Client.h

#ifndef Client_Client_h #define Client_Client_h #include "Client.h" class Client { public: void f1(); void f2(); }; #endif 

Client.cpp

 #include  #include  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  // //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 ++,这样你就可以访问这些function。

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

您还将遇到链接问题:C ++函数名称被破坏成一个混乱,包括它们的参数类型和返回类型和类,它们看起来像__1cGstrcpy6Fpcpkc_0_ 。 在C中声明函数的受损名称以使用它们在技术上是可行的 ,或者使用dlsym来获取指向它们的指针,但这很简单。 不要那样做。

如果你需要在C ++中创建一个需要从C调用的函数,你可以将它指定为extern "C"并且它的名称不会被修改,并且它可以从C访问,它本身就能够使用C ++function:

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

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

 void Foo(); 

而且你可以打电话给它。

您可以将所有要在C语言中暴露的C ++调用包装在extern "C"函数中,并返回指向您的类型的指针并以这种方式处理它,但它会很快变得烦人。 你真的应该只使用C ++。

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