我有以下 C++ 程序:
Client.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 http://en.wikipedia.org/wiki/Name_mangling陷入混乱,包括它们的参数类型和返回类型和类,看起来像__1cGstrcpy6Fpcpkc_0_
。这将是技术上可行声明 C 中函数的重整名称以使用它们,或者使用dlsym
获取指向它们的指针,但这很愚蠢。不要那样做。
如果您需要创建一个function在 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 文件放在那里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)