ubuntu下制作动态链接库so文件并调用(c++调用c)

1 生成动态链接库

  1. 创建用于生成so文件的c源文件:testSo.c
#include "stdio.h"
#include "testH.h"
void vvprints(void)
{
    printf("hello!!, this is from so file.\n");
}
  1. 使用gcc进行编译并生成so文件:
$ gcc  testSo.c  -fPIC  -shared  -o  libtest.so

其中:
-fPIC :表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-shared :该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

2 编写头文件

  1. 创建头文件testH.h:
extern "C" void vvprints(void);

这样做会产生下面的错误:
在这里插入图片描述
解决方法参考http://blog.sina.com.cn/s/blog_640531380102yj80.html:
第一种方法:在C++ 文件(testmain.cpp)中

extern "C"
{
	#include"testH.h"
}

第二种方法:在头文件(testH.h)中

#ifdef __cplusplus                     
extern "C" {
#endif
	void vvprints(void);
#ifdef __cplusplus
}
#endif

3 调用so文件

  1. testmain.cpp:
#include "testH.h"

using namespace std;
int main(void)
{
	lccprints();
	return 0;
}
  1. 将cpp文件与so文件链接并生成执行文件:先将so文件拷贝至/lib文件夹内:
$ sudo cp /home/vv/LinuxLearning/libtest.so /lib/ 

注意:若不进行这一步将会出现下面的错误:
在这里插入图片描述
解决方法参考:严慈善

  1. 再进行编译:
$ g++ testmain.cpp -ltest -o testmain

4 注

参考b站视频:BV1mp4y1k7Dh:
若采用

$ g++ testmain.cpp -o testmain

则报错:
/tmp/ccQn5dH7.o:在函数‘main’中:
testmain.cpp:(.text+0x5):对‘lccprints’未定义的引用
collect2: error: ld returned 1 exit status
意思是链接错误(ld错误),不是编译错误。因此需要告诉编译器去查找链接,加上-lxxx(xxx处是so文件名中的libxxx,因此此处为-ltest):

$ g++ testmain.cpp -ltest -o testmain

若出现:cannot fing -ltest
应改为:

$ g++ testmain.cpp -L. -ltest -o testmain

其中:
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
于是生成了名为testmain的可执行文件,最后在终端中通过./testmain执行该文件,有如下结果:
请添加图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C程序中调用源码安装的库,在Ubuntu中通常需要进行以下步骤: 第一步,安装依赖库:源码安装的库通常依赖于其他的库文件,因此在调用之前,需要确保已经安装了这些依赖库。可以使用apt-get命令来安装缺失的依赖库。 第二步,添加头文件路径:源码安装通常会将库的头文件放置在指定的目录下,而程序需要通过包含头文件来使用库的函数和数据结构。在C程序中,可以通过使用#include指令来包含头文件。因此,在编写C程序时,需要在开头添加如下指令:#include <library_header.h>,其中library_header.h是库的头文件名。 第三步,链接库文件:源码安装会生成库文件,通常是以.so(动态链接库)或.a(静态链接库)的形式存在。而C程序在编译时需要将库文件链接到生成的可执行文件中,以便程序可以调用其中的函数和数据结构。在gcc编译器中,可以通过使用-l参数来指定需要链接的库。例如,如果库文件名为library.so,则编译命令可以写为:gcc -o program program.c -llibrary。 第四步,编写调用代码:在C程序中,可以通过调用库中的函数和使用库中的数据结构来使用源码安装的库。具体的调用方式和使用方法需要根据库的文档来确定,通常会提供相应的示例代码。 因此,使用源码安装的库需要先安装依赖库,然后包含头文件,链接库文件,并在C程序中编写相应的调用代码。以上就是在Ubuntu中在C程序中调用源码安装库的一般步骤。 ### 回答2: 在C程序中调用通过源码安装的Ubuntu库需要进行以下步骤: 1. 在编写C程序时,需要包含相应的头文件。这些头文件通常位于库文件安装目录的include文件夹中。你可以使用命令"sudo find / -name <header_file.h>"来查找头文件的位置。 2. 链接库文件。通过源码安装库时,编译器不会自动找到并链接库文件。你需要将库文件的路径添加到链接器的参数中。在编译C程序时,你可以使用命令"gcc -o output_file source_file.c -I <library_include_path> -L <library_path> -l <library_name>",其中"<library_include_path>"是库的头文件路径,"<library_path>"是库文件路径,"<library_name>"是库名。 3. 调用库函数。通过上述步骤,你应该可以在C程序中使用库函数了。你可以通过引用库的头文件调用库的函数,头文件中定义了函数的接口。 总结起来,要在C程序中调用通过源码安装的Ubuntu库,你需要包含库头文件、链接库文件,并调用库函数。 ### 回答3: 在C程序中调用通过Ubuntu源码安装的库,需要进行以下步骤: 1. 确认库的安装路径:使用"dpkg -L"命令查看库安装的路径。例如,如果安装了libxxx库,可以使用命令"dpkg -L libxxx"查看其安装路径。 2. 在C程序中包含头文件:在C程序的开头,使用#include指令包含库所对应的头文件。例如,如果安装了libxxx库,需要在C程序中添加#include <xxx.h>。 3. 链接库:在编译C程序时,需要将库链接到程序中。使用"-l"选项指定需要链接的库的名称。例如,如果安装了libxxx库,需要在编译命令中添加"-lxxx"。如果库的安装路径不在系统默认路径中,还需要使用"-L"选项指定库的路径。 综上所述,使用Ubuntu源码安装的库在C程序中调用的步骤主要包括确认库的安装路径、包含头文件和链接库。通过这些步骤,可以在C程序中成功调用使用Ubuntu源码安装的库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值