c++工程理解

本文详细介绍了如何编译和使用动态链接库(.so文件)。内容包括头文件的作用、库文件的编译以及源文件的编译过程。在g++编译时,需指定-L和-l选项来链接库文件,并解决因库路径未加入系统搜索目录导致的运行错误。通过编辑/etc/ld.so.conf并执行ldconfig,确保库文件被系统识别。此外,还提到了使用cmake编译可执行文件的方法。
摘要由CSDN通过智能技术生成

一个工程包含三部分,头文件(.h),库文件(.cpp),源文件(.cpp)。

1. 头文件是包含各种#include 和 函数声明等等信息,用于解释说明库文件。

2. 库文件(.cpp)是包含所有函数的.cpp文件,通过将库文件编译成.so或者.a文件,这样只需提供.so或者.a以及头文件就可以方便其他人调用库文件中的函数了。

编译的方式有可以用g++或者cmake的方式。

(1) g++ 编译.so文件

(2) cmake编译.so文件

3. 源文件指的是包含main()函数的.cpp文件,在源文件中需要#include头文件,然后就可以调用库文件中的函数了。

最后,把main.cpp和.so文件编译成可执行文件。

(1) g++ 编译可执行文件

我将libhello.so和main.cpp放在同一个目录下,那么g++编译的时候,需要先用-L. 声明在同一个目录下寻找.so文件,用-lhello确定需要链接的 .so文件 libhello.so,用-l链接的时候 把libhello.so省略为hello,-o 生成名字为main的可执行文件。

g++ main.cpp -L. -lhello -o main

因为libhello.so是我们自定义的.so文件,在编译时可能没问题,但是执行./main是会报错,error while loading shared libraries, 遇到这个问题,

默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定--prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。系统默认的搜索库路径在/etc/ld.so.conf文件中,比如我自定义的.so文件的路径是   /home/nihao/lib/libhello.so , 那么操作如下:

sudo gedit /etc/ld.so.conf

注意输入的路径是目录,不要加上libhello.so,然后保存终端继续输入

sudo ldconfig

使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。

再输入g++ main.cpp -L. -lhello -o 编译没问题,./main也没有问题。

该问题参考https://blog.csdn.net/hankerbit/article/details/83834349

(2) cmake编译可执行文件

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值