linux的ubuntu上如何编译C和C++代码写的动态库,以及调用执行
![star](https://csdnimg.cn/release/downloadcmsfe/public/img/star.98a08eaa.png)
在Linux的Ubuntu操作系统中,编译C和C++代码以创建动态库(即共享对象库,通常以`.so`结尾)以及调用这些库来执行程序是一个常见的需求。以下是一步步教你如何完成这个过程。 我们需要准备源代码文件。在本例中,我们有三个文件: 1. `testc.h`:C语言头文件,声明了一个名为`TestC`的函数。 2. `testc.c`:C语言实现文件,包含了`TestC`函数的定义。 3. `testcpp.h`:C++头文件,声明了一个名为`TestCPP`的函数。 4. `testcpp.cpp`:C++实现文件,包含了`TestCPP`函数的定义。 5. `main.cpp`:主程序文件,包含调用`TestC`和`TestCPP`的代码。 接下来,我们将编译这些源文件以生成动态库`libtest.so`和可执行文件`mtest`。 ### 编译动态库`libtest.so` 动态库的生成使用`gcc`编译器,并通过`-shared`选项来指定生成共享库。在这个例子中,我们将`testc.c`和`testcpp.cpp`编译成一个动态库: ```bash gcc -o libtest.so testc.c testcpp.cpp -shared -lstdc++ ``` 这里的`-lstdc++`是用来链接C++标准库的,因为`testcpp.cpp`是一个C++源文件。 ### 编译可执行文件`mtest` 接下来,我们需要编译`main.cpp`,并链接我们刚刚创建的动态库`libtest.so`。为了做到这一点,我们需要告诉`gcc`在哪里可以找到我们的动态库(`-L`选项)以及库的名字(`-l`选项): ```bash gcc -o mtest -I ./ main.cpp -L . -ltest -lstdc++ ``` 这里,`-I ./`指定了`main.cpp`中包含的头文件所在的目录,`-L .`指定了动态库`libtest.so`的位置,而`-ltest`则是库的名称,不包括`lib`和`.so`。 ### 解决运行时链接问题 当你尝试运行`mtest`时,可能会遇到找不到`libtest.so`的错误。这是因为系统默认不会搜索当前目录下的动态库。为了解决这个问题,你可以使用`ldd`命令查看依赖关系,然后通过修改环境变量`LD_LIBRARY_PATH`来添加当前目录: ```bash ldd ./mtest ``` 如果显示`libtest.so`未找到,可以通过以下方式临时添加当前目录到搜索路径: ```bash export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ``` 或者,如果你希望这个改变在重启后仍然有效,可以在`~/.bashrc`文件中添加这一行,然后重新加载配置: ```bash echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:." >> ~/.bashrc source ~/.bashrc ``` 现在,你应该能够成功运行`mtest`了: ```bash ./mtest ``` 总结来说,创建和使用Linux Ubuntu上的C和C++动态库涉及编译源代码、生成动态库、编译主程序并处理运行时的库搜索路径。理解这个过程对于任何在Linux环境中进行软件开发的人来说都是至关重要的。
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![tar](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/release/download_crawler_static/3292104/bg1.jpg)
![avatar](https://profile-avatar.csdnimg.cn/8b2738d0fead49d4974702162ba2b149_jernymy.jpg!1)
- 粉丝: 223
- 资源: 28
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- C# winform置托盘图标并闪烁演示源码.zip
- 打包和分发Rust工具.pdf
- SQL中的CREATE LOGFILE GROUP 语句.pdf
- C语言-leetcode题解之第172题阶乘后的零.zip
- C语言-leetcode题解之第171题Excel列表序号.zip
- C语言-leetcode题解之第169题多数元素.zip
- ocr-图像识别资源ocr-图像识别资源
- 图像识别:基于Resnet50 + VGG16模型融合的人体细胞癌症分类模型实现-图像识别资源
- C语言-leetcode题解之第168题Excel列表名称.zip
- C语言-leetcode题解之第167题两数之和II-输入有序数组.zip
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
- 1
- 2
- 3
- 4
前往页