您当前的位置: 首页 > 

我什么都布吉岛

暂无认证

  • 4浏览

    0关注

    292博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

GCC的学习(二)头文件及其库制作

我什么都布吉岛 发布时间:2020-05-21 13:24:00 ,浏览量:4

  • 当前目录+相对路径=绝对路径
  • 大写iI头文件包含路径
  • 大写lL库文件路径
  • 小写ll库名字(去头去尾没有lib,也没有so)
  • ldd 查看动态库连接库存在性及其路径
  • nm 查看动态库名称(c++加上-C选项你会有意外收获)
一、-I 头文件路径 1.1 工程结构简单不需要-I选项

gcc程序默认在当前目录下寻找源代码及头文件。结构简单根本不需要-I选项,将他们放在同一级目录下,源文件就可正常找到头文件:

//ttt.cpp
#include 
#include "data.h"
int main()
{
	printf("Hello world\n");
	printf("Data in header is %lf\n",pi);
}
// data.h
double pi=3.1415;

在终端键入:

gcc ttt.cpp

即可正常编译连接形成可执行文件。

1.2 工程结构较复杂

随着工程的进展,为了更清晰的结构,人们常常把头文件和源文件,编译结果分开放在不同的文件夹。仅为演示,将ttt.cppdata,h分别放入两个文件夹src和include中,当前所在的目录为src和include同级的build目录中,如果仍然使用(1.1)方法将会发生错误:

junwuli@ubuntu:~/Desktop/gcctest/build$ gcc ../src/ttt.c 
../src/ttt.c:2:10: fatal error: data.h: No such file or directory
 #include "data.h"
          ^~~~~~~~
compilation terminated.

为什么会发生错误呢?默认情况下,gcc等编译工具两个原因:

  • gcc在当前目录没有源文件
  • gcc在当前目录没有头文件

当然可以再#include中附带路径上所在路径,本例则是:#include "../include/data.h",大多数情况下,我们更加愿意写一个相对简洁头文件名称#include "data.h",使用-I选项,指明两类文件位置即可:

junwuli@ubuntu:~/Desktop/gcctest/build$ gcc ../src/ttt.c -I ../include/
junwuli@ubuntu:~/Desktop/gcctest/build$ ./a.out
Hello world
Data in header is 3.141500

假设我们的主程序不想写相对路径的,只想写一个简洁的“head.h”而不是“./include/”就需要用到这个参数。

gcc hello.c -Iinclude -o app

或者是

gcc hello.c -I include -o app
二、库的制作和使用

无论是静态库还是动态库,都需要将源文件编译成目标文件,再将目标文件整合在一起形成库。这里的这里的库,类似于生活中的仓库,不过存放的内容是目标文件,仓库里有什么,靠的就是头文件。

大概是这样的过程:

#mermaid-svg-QMQLXCWI6RPCZtth .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-QMQLXCWI6RPCZtth .label text{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth .node rect,#mermaid-svg-QMQLXCWI6RPCZtth .node circle,#mermaid-svg-QMQLXCWI6RPCZtth .node ellipse,#mermaid-svg-QMQLXCWI6RPCZtth .node polygon,#mermaid-svg-QMQLXCWI6RPCZtth .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-QMQLXCWI6RPCZtth .node .label{text-align:center;fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth .node.clickable{cursor:pointer}#mermaid-svg-QMQLXCWI6RPCZtth .arrowheadPath{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-QMQLXCWI6RPCZtth .flowchart-link{stroke:#333;fill:none}#mermaid-svg-QMQLXCWI6RPCZtth .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-QMQLXCWI6RPCZtth .edgeLabel rect{opacity:0.9}#mermaid-svg-QMQLXCWI6RPCZtth .edgeLabel span{color:#333}#mermaid-svg-QMQLXCWI6RPCZtth .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-QMQLXCWI6RPCZtth .cluster text{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-QMQLXCWI6RPCZtth .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-QMQLXCWI6RPCZtth text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-QMQLXCWI6RPCZtth .actor-line{stroke:grey}#mermaid-svg-QMQLXCWI6RPCZtth .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-QMQLXCWI6RPCZtth .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-QMQLXCWI6RPCZtth #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-QMQLXCWI6RPCZtth .sequenceNumber{fill:#fff}#mermaid-svg-QMQLXCWI6RPCZtth #sequencenumber{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth #crosshead path{fill:#333;stroke:#333}#mermaid-svg-QMQLXCWI6RPCZtth .messageText{fill:#333;stroke:#333}#mermaid-svg-QMQLXCWI6RPCZtth .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-QMQLXCWI6RPCZtth .labelText,#mermaid-svg-QMQLXCWI6RPCZtth .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-QMQLXCWI6RPCZtth .loopText,#mermaid-svg-QMQLXCWI6RPCZtth .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-QMQLXCWI6RPCZtth .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-QMQLXCWI6RPCZtth .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-QMQLXCWI6RPCZtth .noteText,#mermaid-svg-QMQLXCWI6RPCZtth .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-QMQLXCWI6RPCZtth .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-QMQLXCWI6RPCZtth .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-QMQLXCWI6RPCZtth .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-QMQLXCWI6RPCZtth .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth .section{stroke:none;opacity:0.2}#mermaid-svg-QMQLXCWI6RPCZtth .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-QMQLXCWI6RPCZtth .section2{fill:#fff400}#mermaid-svg-QMQLXCWI6RPCZtth .section1,#mermaid-svg-QMQLXCWI6RPCZtth .section3{fill:#fff;opacity:0.2}#mermaid-svg-QMQLXCWI6RPCZtth .sectionTitle0{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth .sectionTitle1{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth .sectionTitle2{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth .sectionTitle3{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-QMQLXCWI6RPCZtth .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth .grid path{stroke-width:0}#mermaid-svg-QMQLXCWI6RPCZtth .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-QMQLXCWI6RPCZtth .task{stroke-width:2}#mermaid-svg-QMQLXCWI6RPCZtth .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth .taskText:not([font-size]){font-size:11px}#mermaid-svg-QMQLXCWI6RPCZtth .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-QMQLXCWI6RPCZtth .task.clickable{cursor:pointer}#mermaid-svg-QMQLXCWI6RPCZtth .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-QMQLXCWI6RPCZtth .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-QMQLXCWI6RPCZtth .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-QMQLXCWI6RPCZtth .taskText0,#mermaid-svg-QMQLXCWI6RPCZtth .taskText1,#mermaid-svg-QMQLXCWI6RPCZtth .taskText2,#mermaid-svg-QMQLXCWI6RPCZtth .taskText3{fill:#fff}#mermaid-svg-QMQLXCWI6RPCZtth .task0,#mermaid-svg-QMQLXCWI6RPCZtth .task1,#mermaid-svg-QMQLXCWI6RPCZtth .task2,#mermaid-svg-QMQLXCWI6RPCZtth .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-QMQLXCWI6RPCZtth .taskTextOutside0,#mermaid-svg-QMQLXCWI6RPCZtth .taskTextOutside2{fill:#000}#mermaid-svg-QMQLXCWI6RPCZtth .taskTextOutside1,#mermaid-svg-QMQLXCWI6RPCZtth .taskTextOutside3{fill:#000}#mermaid-svg-QMQLXCWI6RPCZtth .active0,#mermaid-svg-QMQLXCWI6RPCZtth .active1,#mermaid-svg-QMQLXCWI6RPCZtth .active2,#mermaid-svg-QMQLXCWI6RPCZtth .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-QMQLXCWI6RPCZtth .activeText0,#mermaid-svg-QMQLXCWI6RPCZtth .activeText1,#mermaid-svg-QMQLXCWI6RPCZtth .activeText2,#mermaid-svg-QMQLXCWI6RPCZtth .activeText3{fill:#000 !important}#mermaid-svg-QMQLXCWI6RPCZtth .done0,#mermaid-svg-QMQLXCWI6RPCZtth .done1,#mermaid-svg-QMQLXCWI6RPCZtth .done2,#mermaid-svg-QMQLXCWI6RPCZtth .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-QMQLXCWI6RPCZtth .doneText0,#mermaid-svg-QMQLXCWI6RPCZtth .doneText1,#mermaid-svg-QMQLXCWI6RPCZtth .doneText2,#mermaid-svg-QMQLXCWI6RPCZtth .doneText3{fill:#000 !important}#mermaid-svg-QMQLXCWI6RPCZtth .crit0,#mermaid-svg-QMQLXCWI6RPCZtth .crit1,#mermaid-svg-QMQLXCWI6RPCZtth .crit2,#mermaid-svg-QMQLXCWI6RPCZtth .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-QMQLXCWI6RPCZtth .activeCrit0,#mermaid-svg-QMQLXCWI6RPCZtth .activeCrit1,#mermaid-svg-QMQLXCWI6RPCZtth .activeCrit2,#mermaid-svg-QMQLXCWI6RPCZtth .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-QMQLXCWI6RPCZtth .doneCrit0,#mermaid-svg-QMQLXCWI6RPCZtth .doneCrit1,#mermaid-svg-QMQLXCWI6RPCZtth .doneCrit2,#mermaid-svg-QMQLXCWI6RPCZtth .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-QMQLXCWI6RPCZtth .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-QMQLXCWI6RPCZtth .milestoneText{font-style:italic}#mermaid-svg-QMQLXCWI6RPCZtth .doneCritText0,#mermaid-svg-QMQLXCWI6RPCZtth .doneCritText1,#mermaid-svg-QMQLXCWI6RPCZtth .doneCritText2,#mermaid-svg-QMQLXCWI6RPCZtth .doneCritText3{fill:#000 !important}#mermaid-svg-QMQLXCWI6RPCZtth .activeCritText0,#mermaid-svg-QMQLXCWI6RPCZtth .activeCritText1,#mermaid-svg-QMQLXCWI6RPCZtth .activeCritText2,#mermaid-svg-QMQLXCWI6RPCZtth .activeCritText3{fill:#000 !important}#mermaid-svg-QMQLXCWI6RPCZtth .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-QMQLXCWI6RPCZtth g.classGroup text .title{font-weight:bolder}#mermaid-svg-QMQLXCWI6RPCZtth g.clickable{cursor:pointer}#mermaid-svg-QMQLXCWI6RPCZtth g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-QMQLXCWI6RPCZtth g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-QMQLXCWI6RPCZtth .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-QMQLXCWI6RPCZtth .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-QMQLXCWI6RPCZtth .dashed-line{stroke-dasharray:3}#mermaid-svg-QMQLXCWI6RPCZtth #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth .commit-id,#mermaid-svg-QMQLXCWI6RPCZtth .commit-msg,#mermaid-svg-QMQLXCWI6RPCZtth .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-QMQLXCWI6RPCZtth g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-QMQLXCWI6RPCZtth g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-QMQLXCWI6RPCZtth g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-QMQLXCWI6RPCZtth .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-QMQLXCWI6RPCZtth .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-QMQLXCWI6RPCZtth .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-QMQLXCWI6RPCZtth .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-QMQLXCWI6RPCZtth .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-QMQLXCWI6RPCZtth .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-QMQLXCWI6RPCZtth .edgeLabel text{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QMQLXCWI6RPCZtth .node circle.state-start{fill:black;stroke:black}#mermaid-svg-QMQLXCWI6RPCZtth .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-QMQLXCWI6RPCZtth #statediagram-barbEnd{fill:#9370db}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-state .divider{stroke:#9370db}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-QMQLXCWI6RPCZtth .note-edge{stroke-dasharray:5}#mermaid-svg-QMQLXCWI6RPCZtth .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-QMQLXCWI6RPCZtth .error-icon{fill:#522}#mermaid-svg-QMQLXCWI6RPCZtth .error-text{fill:#522;stroke:#522}#mermaid-svg-QMQLXCWI6RPCZtth .edge-thickness-normal{stroke-width:2px}#mermaid-svg-QMQLXCWI6RPCZtth .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-QMQLXCWI6RPCZtth .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-QMQLXCWI6RPCZtth .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-QMQLXCWI6RPCZtth .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-QMQLXCWI6RPCZtth .marker{fill:#333}#mermaid-svg-QMQLXCWI6RPCZtth .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-QMQLXCWI6RPCZtth { color: rgba(0, 0, 0, 0.75); font: ; }
源文件
目标文件
库的打包
2.1 库的命名规则

和变量命名一样,Linux库的命名也要揭示库的属性、名称。

libxxx.so.x.y.z
libxxx.a.x.y.z
部分含义lib文件属性xxx库名称.so/.a库类型.x.y.z版本号[2] 2.2 静态库的制作和使用 2.2.1 制作静态库

以a.c b.c为例,生成目标文件:

gcc a.c b.c -c 

默认生成同名目标文件a.o b.o

根据上一步产生的a.o b.o材料,打包目标文件

ar rcs libtest.a a.o b.o

注:rcs 代表插入目标文件创建归档文件及引索。

2.2.2 使用静态库

libtest.a + 头文件,头文件加库使用静态库

gcc main.c -I ./include/ -L ./lib/ -ltest -o app

注:nm(name)可以查看lib中的内容

2.3 动态库制作和使用

简单来说就是源文件**-fPIC选项编译成.o,再用-shared**选项打包成.so。

#mermaid-svg-pGxAXDL35vp5WqP2 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .label text{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .node rect,#mermaid-svg-pGxAXDL35vp5WqP2 .node circle,#mermaid-svg-pGxAXDL35vp5WqP2 .node ellipse,#mermaid-svg-pGxAXDL35vp5WqP2 .node polygon,#mermaid-svg-pGxAXDL35vp5WqP2 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-pGxAXDL35vp5WqP2 .node .label{text-align:center;fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .node.clickable{cursor:pointer}#mermaid-svg-pGxAXDL35vp5WqP2 .arrowheadPath{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-pGxAXDL35vp5WqP2 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-pGxAXDL35vp5WqP2 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-pGxAXDL35vp5WqP2 .edgeLabel rect{opacity:0.9}#mermaid-svg-pGxAXDL35vp5WqP2 .edgeLabel span{color:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-pGxAXDL35vp5WqP2 .cluster text{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-pGxAXDL35vp5WqP2 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-pGxAXDL35vp5WqP2 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-pGxAXDL35vp5WqP2 .actor-line{stroke:grey}#mermaid-svg-pGxAXDL35vp5WqP2 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-pGxAXDL35vp5WqP2 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .sequenceNumber{fill:#fff}#mermaid-svg-pGxAXDL35vp5WqP2 #sequencenumber{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .messageText{fill:#333;stroke:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-pGxAXDL35vp5WqP2 .labelText,#mermaid-svg-pGxAXDL35vp5WqP2 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-pGxAXDL35vp5WqP2 .loopText,#mermaid-svg-pGxAXDL35vp5WqP2 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-pGxAXDL35vp5WqP2 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-pGxAXDL35vp5WqP2 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-pGxAXDL35vp5WqP2 .noteText,#mermaid-svg-pGxAXDL35vp5WqP2 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-pGxAXDL35vp5WqP2 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-pGxAXDL35vp5WqP2 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-pGxAXDL35vp5WqP2 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-pGxAXDL35vp5WqP2 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 .section{stroke:none;opacity:0.2}#mermaid-svg-pGxAXDL35vp5WqP2 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-pGxAXDL35vp5WqP2 .section2{fill:#fff400}#mermaid-svg-pGxAXDL35vp5WqP2 .section1,#mermaid-svg-pGxAXDL35vp5WqP2 .section3{fill:#fff;opacity:0.2}#mermaid-svg-pGxAXDL35vp5WqP2 .sectionTitle0{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .sectionTitle1{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .sectionTitle2{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .sectionTitle3{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-pGxAXDL35vp5WqP2 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 .grid path{stroke-width:0}#mermaid-svg-pGxAXDL35vp5WqP2 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-pGxAXDL35vp5WqP2 .task{stroke-width:2}#mermaid-svg-pGxAXDL35vp5WqP2 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 .taskText:not([font-size]){font-size:11px}#mermaid-svg-pGxAXDL35vp5WqP2 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-pGxAXDL35vp5WqP2 .task.clickable{cursor:pointer}#mermaid-svg-pGxAXDL35vp5WqP2 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-pGxAXDL35vp5WqP2 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-pGxAXDL35vp5WqP2 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-pGxAXDL35vp5WqP2 .taskText0,#mermaid-svg-pGxAXDL35vp5WqP2 .taskText1,#mermaid-svg-pGxAXDL35vp5WqP2 .taskText2,#mermaid-svg-pGxAXDL35vp5WqP2 .taskText3{fill:#fff}#mermaid-svg-pGxAXDL35vp5WqP2 .task0,#mermaid-svg-pGxAXDL35vp5WqP2 .task1,#mermaid-svg-pGxAXDL35vp5WqP2 .task2,#mermaid-svg-pGxAXDL35vp5WqP2 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-pGxAXDL35vp5WqP2 .taskTextOutside0,#mermaid-svg-pGxAXDL35vp5WqP2 .taskTextOutside2{fill:#000}#mermaid-svg-pGxAXDL35vp5WqP2 .taskTextOutside1,#mermaid-svg-pGxAXDL35vp5WqP2 .taskTextOutside3{fill:#000}#mermaid-svg-pGxAXDL35vp5WqP2 .active0,#mermaid-svg-pGxAXDL35vp5WqP2 .active1,#mermaid-svg-pGxAXDL35vp5WqP2 .active2,#mermaid-svg-pGxAXDL35vp5WqP2 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-pGxAXDL35vp5WqP2 .activeText0,#mermaid-svg-pGxAXDL35vp5WqP2 .activeText1,#mermaid-svg-pGxAXDL35vp5WqP2 .activeText2,#mermaid-svg-pGxAXDL35vp5WqP2 .activeText3{fill:#000 !important}#mermaid-svg-pGxAXDL35vp5WqP2 .done0,#mermaid-svg-pGxAXDL35vp5WqP2 .done1,#mermaid-svg-pGxAXDL35vp5WqP2 .done2,#mermaid-svg-pGxAXDL35vp5WqP2 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-pGxAXDL35vp5WqP2 .doneText0,#mermaid-svg-pGxAXDL35vp5WqP2 .doneText1,#mermaid-svg-pGxAXDL35vp5WqP2 .doneText2,#mermaid-svg-pGxAXDL35vp5WqP2 .doneText3{fill:#000 !important}#mermaid-svg-pGxAXDL35vp5WqP2 .crit0,#mermaid-svg-pGxAXDL35vp5WqP2 .crit1,#mermaid-svg-pGxAXDL35vp5WqP2 .crit2,#mermaid-svg-pGxAXDL35vp5WqP2 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-pGxAXDL35vp5WqP2 .activeCrit0,#mermaid-svg-pGxAXDL35vp5WqP2 .activeCrit1,#mermaid-svg-pGxAXDL35vp5WqP2 .activeCrit2,#mermaid-svg-pGxAXDL35vp5WqP2 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-pGxAXDL35vp5WqP2 .doneCrit0,#mermaid-svg-pGxAXDL35vp5WqP2 .doneCrit1,#mermaid-svg-pGxAXDL35vp5WqP2 .doneCrit2,#mermaid-svg-pGxAXDL35vp5WqP2 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-pGxAXDL35vp5WqP2 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-pGxAXDL35vp5WqP2 .milestoneText{font-style:italic}#mermaid-svg-pGxAXDL35vp5WqP2 .doneCritText0,#mermaid-svg-pGxAXDL35vp5WqP2 .doneCritText1,#mermaid-svg-pGxAXDL35vp5WqP2 .doneCritText2,#mermaid-svg-pGxAXDL35vp5WqP2 .doneCritText3{fill:#000 !important}#mermaid-svg-pGxAXDL35vp5WqP2 .activeCritText0,#mermaid-svg-pGxAXDL35vp5WqP2 .activeCritText1,#mermaid-svg-pGxAXDL35vp5WqP2 .activeCritText2,#mermaid-svg-pGxAXDL35vp5WqP2 .activeCritText3{fill:#000 !important}#mermaid-svg-pGxAXDL35vp5WqP2 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-pGxAXDL35vp5WqP2 g.classGroup text .title{font-weight:bolder}#mermaid-svg-pGxAXDL35vp5WqP2 g.clickable{cursor:pointer}#mermaid-svg-pGxAXDL35vp5WqP2 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-pGxAXDL35vp5WqP2 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-pGxAXDL35vp5WqP2 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-pGxAXDL35vp5WqP2 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-pGxAXDL35vp5WqP2 .dashed-line{stroke-dasharray:3}#mermaid-svg-pGxAXDL35vp5WqP2 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 .commit-id,#mermaid-svg-pGxAXDL35vp5WqP2 .commit-msg,#mermaid-svg-pGxAXDL35vp5WqP2 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-pGxAXDL35vp5WqP2 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-pGxAXDL35vp5WqP2 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-pGxAXDL35vp5WqP2 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-pGxAXDL35vp5WqP2 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-pGxAXDL35vp5WqP2 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-pGxAXDL35vp5WqP2 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-pGxAXDL35vp5WqP2 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-pGxAXDL35vp5WqP2 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-pGxAXDL35vp5WqP2 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-pGxAXDL35vp5WqP2 .edgeLabel text{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-pGxAXDL35vp5WqP2 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-pGxAXDL35vp5WqP2 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-pGxAXDL35vp5WqP2 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-pGxAXDL35vp5WqP2 .note-edge{stroke-dasharray:5}#mermaid-svg-pGxAXDL35vp5WqP2 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-pGxAXDL35vp5WqP2 .error-icon{fill:#522}#mermaid-svg-pGxAXDL35vp5WqP2 .error-text{fill:#522;stroke:#522}#mermaid-svg-pGxAXDL35vp5WqP2 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-pGxAXDL35vp5WqP2 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-pGxAXDL35vp5WqP2 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-pGxAXDL35vp5WqP2 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-pGxAXDL35vp5WqP2 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-pGxAXDL35vp5WqP2 .marker{fill:#333}#mermaid-svg-pGxAXDL35vp5WqP2 .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-pGxAXDL35vp5WqP2 { color: rgba(0, 0, 0, 0.75); font: ; }
源文件
目标文件
库的打包
2.3.1 制作动态库

以a.c b.c为例,-fPIC选项,生成目标文件[3]:

gcc a.c b.c -c -fPIC(-fpic)

根据上一步产生的a.o b.o材料,–shared选项,打包目标文件。PS:双杠或者单杠都可以/

gcc -shared a.o b.o -o libxxx.so
2.3.2 使用动态库

头文件加库设置使用动态库

gcc main.c -I ./include/ -L ./lib/ -lxxx -o app

和静态库一样的,指定库所在路径,库的名称。如果他和源文件在同一级目录,OK,完全没有问题,但是,如果它在下一级的lib当中,就会提示找不到了!

ldd 用静态库编译的可执行文件

上面这个可以查看依赖库,以及其是否被找到。

2.4 动态库搜索路径(ldd查看连接情况,nm查看接口)

动态库和可执行程序、和.o文件他们的格式都为ELF,系统使用ld-linux.so.X[1]来完成。按顺序分别是:

  • ELF文件的DT_PRATH段
  • 环境变量LD_LIBRARY_PATH
  • 文件列表 /etc/ld.so.cache
  • /lib usr/lib

在任意步骤找到,都将会载入内存正常使用,反之报找不到库的错误。你可以通过ldd+目标文件:打印其共享库依赖,可以用来看看依赖库是否存在以及路径在哪。

注释: [1] Glibc安装的库中有一个为ld-linux.so.X,其中X为一个数字,在不同的平台上名字也会不同,如ubuntu18.04就为ld-linux-x86-64.so.2

[2]x表示主版本号,不同主版本一般不兼容;y次版本号,库的增量升级,原接口不变但是新增了一些接口,同时兼容旧版本;z发布版本号,一些库功能错误、性能改善,接口不增加也不更改。

[3] 为了兼容各个系统,在生成位置无关的代码的时候,应该使用-fPIC参数。

参考文章:

【1】《-fpic 与-fPIC的区别》 作者:zhang_dawei666 (https://blog.csdn.net/xiangguiwang/article/details/81939237)

扩展:

动态和静态库的区别:https://www.cnblogs.com/mhscn/p/4264357.html

关注
打赏
1658157489
查看更多评论
立即登录/注册

微信扫码登录

0.0382s