Makefile学习笔记06|编译动态链接库

  希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。

  这里是目录

静态链接与动态链接

  链接分为两种:静态链接、动态链接。

  1. 静态链接
      静态链接:由链接器在链接时讲库的内容加入到可执行文件中。
    优点:
  • 对环境的依赖性小,具有较好的兼容性。
    缺点:
  • 生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间。
  • 库函数有了更新,必须重新编译应用程序。
  1. 动态链接
      动态链接:链接器在链接时仅仅建立与所需库函数之间的链接关系,在程序运行时才将所需资源调入可执行程序。
    优点:
  • 在需要的时候才会调入对应的资源函数。
  • 简化程序的升级;有着较小的程序体积。
  • 实现进程之间的资源共享(避免重复拷贝)。
    缺点:
  • 应用程序在运行时依赖动态库,不能独立运行。
  • 动态库依赖版本问题严重。
  1. 动态、静态编译对比
      系统默认采用动态链接的方式进行程序编译,若想采用静态编译,需加入参数-static。

编译选项

  • -fPIC
  • -shared
 g++ -shared -fPIC mylib.cpp -o libmylib.sog++ test.cpp -lmylib -L/root/cpp#!/bin/shLD_LIBRARY_PATH=./;export LD_LIBRARY_PATH./test

静态库编译选项

  编译静态库时有两个常用的可选参数和一个必选参数。

选项 描述
[c] 不显示创建
[v] 显示过程
r 创建静态库
s 建立索引

项目结构

  总项目下分三个子项目,分别为xserver、xthread、xcom。

项目名称 路径 文件 输出
xserver ~/make/src/xserver xserver.cpp、makefile xserver
xthread ~/make/src/xthread xthread.h、xthread.cpp、makefile libxthread.so
xcom ~/make/src/xcom xcom.h、xcom.cpp、makefile libxcom.a

XThread

// xthread.h
#ifndef XTHREAD_H
#define XTHREAD_H
#include <thread>
class XThread
{public:virtual void Start();virtual void Wait();
private:virtual void Main()=0;std::thread th_;
};
#endif
// xthread.cpp
#include "xthread.h"
#include <iostream>
using namespace std;
void XThread::Start()
{cout<<"Start Thread"<<endl;th_ = std::thread(&XThread::Main, this);
}
void XThread::Wait()
{cout<<"begin Wait Thread"<<endl;th_.join();cout<<"end Wait Thread"<<endl;
}
# makefile
TARGET=libxthread.so
OBJS=xthread.o
LDFALGS=-shared
CXXFLAGS=-fPIC
$(TARGET):$(OBJS)$(CXX) $(LDFLAGS) $^ -O $@
clean:$(RM) $(TARGET) $(OBJS).PHONY: clean

  make后可生成libxthread.so。

xesrver

#include <iostream>
#include "xthread.h"
using namespace std;
class XTask:public XThread
{public:void Main() override{cout<<"XTask main"<<endl;}
};
int main(int argc, char *argv[])
{cout<<"XServer"<<endl;XTask task;task.Start();task.Wait();return 0;
}
TARGET=xserver
OBJS=xserver.o
CXXFLAGS=-I../xthread
LDFLAGS=-L../xthread
LIBS=-lxthread -lpthread
$(TARGET):$(OBJS)$(CXX) $^ -o $@ $(LDFLAGS) $(LIBS)
clean:$(RM) $(TARGET) $(OBJS)

  make一下,没有出错,因为在程序运行时才会去寻找动态链接库。接下来运行程序:./xserver。结果出错:./xserver: error while loading shared libraries: libxthread.so: cannot open shared object file: No such file or directory。原因是之前的makefile中虽然指明了动态链接库的路径,但那只是在编译时将动态链接库的路径告知了make。make按照路径找到了动态链接库,并将函数的地址编译进了可执行文件中。程序执行时只有函数的地址却不知道动态链接库文件也就是.so文件的路径,故而报错。简言之就是,makefile只管编译,不管运行。为了解决这一问题,暂且编写一个shell脚本run来应付一下,后面会优化的。

# run
# 手动设定一下路径
LD_LIBRARY_PATH=../xthread
export LD_LIBRARY_PATH
./xserver
# 加上可执行权限
sudo chmod +x run
./run

  这样就可以正确运行了。
  都看到这里了,可以给个点赞或者评论吗?达瓦里希( ̄^ ̄)ゞ

Makefile学习笔记06|编译动态链接库相关推荐

  1. Makefile学习笔记07|编译静态库并通过ifeq语句

    Makefile学习笔记07|编译静态库并通过ifeq语句   希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢.   这里是目录   本篇与上一篇有较多联系,有兴趣的可以先看上一 ...

  2. Makefile学习笔记 - 我的CPP之路 - C++博客

    Makefile学习笔记 - 我的CPP之路 - C++博客 Makefile学习笔记 Makefile学习笔记 先列出一个很简单的Makefile例子: --------- hd.cpp #incl ...

  3. ESP32 单片机学习笔记 - 06 - (以太网)Ethernet转Wifi

    ESP32 单片机学习笔记 - 06 - (以太网)Ethernet转Wifi 暂停了半个多月的学习,去调车了.现在课设开始了,赶紧回来把一开始的"以太网"目标学完.但是却发现,好 ...

  4. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  5. Makefile 学习笔记

    Makefile学习笔记 1. gcc编译过程 预处理 gcc -E hello.c -o hello.i 编译 gcc -S hello.i -o hello.s 汇编 gcc -c hello.s ...

  6. JavaWeb黑马旅游网-学习笔记06【旅游线路分页展示分页展示】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  7. JavaWeb-综合案例(用户信息)-学习笔记06【复杂条件查询功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  8. JavaScript学习笔记06【高级——JavaScript中的事件】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  9. MySQL学习笔记06【多表查询、子查询、多表查询练习】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

最新文章

  1. 如何处理单元测试产生的数据,下列哪些说法是正确的
  2. R语言使用scales包的hue_pal函数获取ggplot2任何级别的离散色码、使用scales包的hue_pal函数获取ggplot2任何级别的反序(reverse)离散色码
  3. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第五场)
  4. yolo3连接网络摄像头实现目标检测命令
  5. 鲁迅散文——狗的驳诘
  6. HALCON示例程序classify_image_class_svm.hdev使用SVM分类器对多通道图像进行分类
  7. deepinv2 添加打印机_科学网-Deepin Linux虚拟PDF打印机的安装与妙用-黄健的博文
  8. MVVM框架原理浅析
  9. QTP之reporter对象方法全解析
  10. java 日历转化-阴历转阳历
  11. 面圆机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  12. iOS开发学习笔记-C语言学习(一)
  13. 二分答案——洛谷P2440木材加工
  14. 以后数据收集、共享、查询全靠它了,太高效!
  15. OSI 7层网络模型
  16. 【Linux】常用命令汇总
  17. Windows系统安装lua
  18. pdf文件去掉广告,水印,背景和删除密码方法收藏
  19. 2017年,加密货币对冲基金收益超过1000%
  20. YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

热门文章

  1. Java记一次ldap登录操作
  2. Camera对焦模式
  3. 压缩解压命令(gzip、gunzip | tar | zip、unzip | bzip2、bunzip2)
  4. AOP+自定义注解实现字典翻译
  5. LeetCode55+56
  6. 软件系统设计-10-防御式编程
  7. python定义空字典_python字典空值
  8. django设置cookie
  9. 详细了解JS中三目运算
  10. 红玫瑰调成蓝玫瑰ps变色换装更改颜色#ps教程#ps学习