我有以下c++程序:
客户端
#ifndef Client_Client_h
#define Client_Client_h
#include "Client.h"
class Client {
public:
void f1();
void f2();
};
#endif
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;
}
在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/