如何将C++静态库链接到C程序
How do you link a C++ static library to a C program?
我有以下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文件放在那里。
相关文章:
- 基于boost的程序的静态链接——zlib问题
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 将gsl c++程序与"英特尔MKL"链接
- 将 glade 文件与程序 g++ 链接
- Qt creator 4.11,在应用程序输出面板中创建一个链接
- 在树莓派上用libtorch构建程序时的链接问题
- 我的应用程序无法在安卓上使用OpenSSL进行链接
- C++实用程序::转换在静态链接库中不起作用
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 如何使用QtCreator将应用程序与"libqsqlpsql.so"链接?
- 为什么当我在 C 程序中链接静态库时会"undefined symbol"?
- 如何在 debian 下正确链接一个 opengl 程序?
- 在发布模式下启动使用库的静态链接编译的应用程序时出错
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 检查G 是否可以链接程序
- C链接程序并在主函数上使用其他程序的方法(数独)
- 使用g++链接程序集和C++时未定义的引用
- 如何在c++中链接程序
- 链接C程序到c++共享库
- 无法使用 Boost.File system 链接程序