1. http://blog.csdn.net/Lux_Veritas/article/details/11934083
    http://www.cnblogs.com/catch/p/3857964.html
  2.  
  3. mmap/munmap工具使用
  4.  
  5. #include <unistd.h>
  6. #include <sys/mman.h>
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. main()
  10. {
  11. int *p=mmap(NULL,
  12. getpagesize(), //页的大小
  13. PROT_READ|PROT_WRITE, //读写权限
  14. MAP_ANONYMOUS|MAP_SHARED,,);
  15. *p=;
  16. *(p+)=;
  17. *p(p+)=;
  18. printf("%d\n",p[]);
  19. munmap(p,); //释分配的页
  20.  
  21. }
  22.  
  23. --------------------------------------
  24. #include <sys/mman.h>
  25. #include <stdlib.h>
  26. #include <stdio.h>
  27. main()
  28. {
  29. int *p=mmap(NULL,
  30. getpagesize(),
  31. PROT_READ, //测试只读权限
  32. MAP_ANONYMOUS|MAP_SHARED,,);
  33. *p=;
  34. *(p+)=;
  35. *p(p+)=;
  36. printf("%d\n",p[]);
  37. munmap(p,); //释分配的页
  38.  
  39. }
  40.  
  41. 段错误
  42. ------------------------------------------------------
  43. 总结:
  44. 选择择什么样的管理方法
  45. C++:
  46. STL :操作方便
  47. new :操作方便
  48. 智能指针
  49.  
  50. C
  51. malloc :小而多数据(类型多,数据多)
  52. brk/sbrk (同类型的数据,动态移动指针)
  53. mmap/munmap: 控制内存的访问权限,使用文件映射,控制内存的共享(进程数据间共享)
  54.  
  55. brk/sbrk,mmap/munmap 效率最高的
  56. -------------------------------------------------------------------
  57.  
  58. 编程工具与动态库
  59. .GCC
  60. .MAKE
  61. .GDB
  62. .其他工具
  63. .共享库
  64.  
  65. gcc:
  66. -o: 输出的文件名
  67. -O,-O0,-O1,-O2,-O3 :编绎优化
  68. -g,-g0,-g1,-g2,-g3 :产生调试信息 越来越大,调试信息越多
  69. -W :取消警告
  70. -Wall 显示所有警告
  71. -Werror:把警告当错误
  72. -c :只编绎不链接:
  73. -E :预编绎 gcc map.c -E -omain.i
  74. -S :汇编
  75.  
  76. 编绎过程:-e -> -c ->-S :自动调用连接器
  77. 连接器 ld
  78.  
  79. -D 在命令行定义宏
  80. 在代码中定义宏
  81. 在命令令行定义宏
  82. -x 指定编译的语言类型号
  83. c++,c,s,none
  84. gcc -x assembler map.s
  85. gcc -x none map.c //自动
  86.  
  87. -std: c99,c89
  88. gcc -std=c99 gcc.c -DNUM=
  89. gcc -std=c89 gcc.c -DNUM=
  90.  
  91. ----------------------------------
  92. eg:
  93. gcc.c
  94. int printf(const char *,...);
  95. main()
  96. {
  97. printf("%d\n",NUM);
  98.  
  99. }
  100.  
  101. gcc gcc.c -omain -DNUM= //在命令定义宏
  102.  
  103. EG2
  104. int add(int * restrict a)
  105. restrict:值放到寄存器,提搞速度,c99可以编绎通过,c89不可以
  106. -----------------------------------
  107. 文件扩展名:
  108. .c: c文件
  109. .cpp:c++
  110. .CC:c++
  111. .h 头文件
  112. .hpp 头文件
  113. .a
  114. .o 目标文件
  115. .so :动态链接库
  116. .i 预编绎文件
  117. .s 汇编
  118.  
  119. 示例:
  120. gcc map.c -omain -O
  121. gcc map.c -omain -O0
  122. gcc map.c -omain -O1
  123. gcc map.c -omain -O2
  124. gcc map.c -omain -O3
  125.  
  126. gcc map.c -omain -w
  127. gcc map.c -omain -Wall
  128. gcc map.c -omain -Werror
  129. ----------------------------------------------
  130.  
  131. .静态库的编绎
  132. .编绎过程(*.a)
  133. 1.1.编绎成目标文件
  134. -static 可选
  135. gcc -c -static <code>
  136. 1.2.归档成静态库
  137. ar工具
  138. ar -r 静态库文件 被归档的文件
  139. ar -r ku.a ku1.o ku2.o
  140. ar -t ku.a //查看有那些目标文件
  141.  
  142. nm工具:(查看函数符号表)
  143. nm ku.a
  144. nm 表态库/动态库/目标文件/执行文件
  145.  
  146. 总结:
  147. 什么是库?
  148. .函数封装的的二进制已经编译的归档中
  149. .ar归档工具
  150. .才用库方式管理代码优点
  151. 容易组织代码
  152. 复用
  153. 保护代码版
  154. .静态库的静态的含义:
  155. 编译好的程序运行时候不依赖库
  156. 库作用为程序的一部分编译连接
  157. .表态库本质:
  158. 就是目标文件的集合(归档文件)
  159.  
  160. .-static 可选
  161.  
  162. .库的规范与约定
  163. 库命令名规则
  164. lib<库名>.a.主版本号.次版本号.批号
  165. lib<库名>.a
  166.  
  167. eg:
  168. ar -r libdemo1.a optool.o graphic.o
  169.  
  170. 库的使用规则:标准使用方法
  171. -l:库名
  172. -L:库目录
  173. gcc main.c -omain -ldemo2 -L. //静态库
  174. //在当前目录搜索libdemo2.a这个文件
  175. .
  176.  
  177. eg:
  178.  
  179. ku1.c
  180. int add(int ,a int b)
  181. {
  182. return a+b;
  183.  
  184. }
  185.  
  186. ku2.c
  187. int sub( int a,int b)
  188. {
  189.  
  190. return a-b;
  191.  
  192. }
  193.  
  194. callku.c
  195. main()
  196. {
  197.  
  198. int r=add(,);
  199. int s=sub(,);
  200.  
  201. }
  202.  
  203. gcc -static -c ku1.c
  204. ku1.o
  205.  
  206. gcc -static -c ku2.c
  207. ku2.o
  208.  
  209. ar -r ku.a ku1.o ku2.o
  210.  
  211. gcc callku.c ku.a -omain //非标准库调用
  212.  
  213. //ku.a静态库
  214. -----------------------------------------------------------
  215.  
  216. 四.动态库的编绎
  217. .什么是动态库?(共享库)
  218. 动态库是可以执行,静态库不能执行
  219. 但动态库没有main,不能独立执行
  220. 动态库不会连接成程序的一部分
  221. 程序执行时候,必须需要动态库文件
  222.  
  223. .工具
  224. ldd 察看程序使用的动态库(只可以查看可执行文件)
  225. eg:
  226. ldd main
  227.  
  228. nm 查看库中的函数符号
  229.  
  230. readelf -h main 查看执行程序头信息 elf格式
  231.  
  232. [root@monitor ~]# readelf -h a.out
  233. ELF Header:
  234. Magic: 7f 4c
  235. Class: ELF64
  236. Data: 's complement, little endian
  237. Version: (current)
  238. OS/ABI: UNIX - System V
  239. ABI Version:
  240. Type: EXEC (Executable file)
  241. Machine: Advanced Micro Devices X86-
  242. Version: 0x1
  243. Entry point address: 0x400500
  244. Start of program headers: (bytes into file)
  245. Start of section headers: (bytes into file)
  246. Flags: 0x0
  247. Size of this header: (bytes)
  248. Size of program headers: (bytes)
  249. Number of program headers:
  250. Size of section headers: (bytes)
  251. Number of section headers:
  252. Section header string table index:
  253.  
  254. .动态库的编译
  255. 3.1.编绎
  256. -c -fpic(可选)
  257.  
  258. gcc -c -fpic iotool.c
  259. gcc -c -fpic graphic.c
  260.  
  261. .gcc -shared -odemo3.so iotool.o graphic.o 非标准动态库名
  262. .gcc -shared -olibdemo4.so iotool.o graphic.o 标准动态库名
  263.  
  264. 4使用动态库
  265. gcc 代码 动态库文件名
  266. gcc code -l库名 -L动态库所在路径
  267. 3.2
  268. gcc -c -fpic iotool.c
  269. gcc -c -fpic graphic.c
  270. gcc -shared -olibdemo4.so iotool.o graphic.o
  271. gcc main.c -ldemo4 -L. -omain
  272.  
  273. ldd main
  274. 结果:
  275. linux-gate.so.
  276. libdemo4.so=>not found
  277. libc.so.
  278. /lib/ld-linux.so.
  279.  
  280. ./main报错
  281.  
  282. 解决方法:
  283. export LD_LIBRARY_PATH=.:~:..:~soft01 //只对当前shell有效 表示到这些目录去找
  284.  
  285. ~soft01:指定soft01用户的主目录
  286. ~ :当前用户主目录
  287.  
  288. 库标准命令名规则:
  289. lib库名.so
  290. lib库名.a
  291. -l 库名 -L 库所在路径
  292.  
  293. 问题:
  294. 4.1.执行程序怎么加载动态库?
  295. 见(动态库的加载)
  296.  
  297. 4.2.动态库没有作为执行程序的一部分,为什么连接需要指定动态库以及目标录?
  298. 连接器需要确定函数在动态库的偏移的位置
  299.  
  300. 动态库的加载:
  301. .找到动态库(系统对动态库查找规则)
  302. .加载动态库到内存
  303. .映射到用户的内存空间
  304.  
  305. 系统对动态库查找规则
  306. ./lib :需要ROOT权限把动态库考到该目录
  307. ./usr/lib :需要ROOT权限把动态库考到该目录
  308. .到环境变量LD_LIBRARY_PATH指定的路径中查找
  309. 如果没有root 权限,可以在LD_LIBRARY_PATH指定的路径中查找
  310. export LD_LIBRARY_PATH=.:~:..:~soft01
  311.  
  312. 缓冲机制:
  313. 把/lib:/usr/lib:LD_LIBRARY_PATH加载到内存缓存中,加速读取,不到硬盘查找
  314.  
  315. /sbin/ldconfig -v 刷新缓冲中so的搜索路径 /lib,/usr/lib
  316. eg:
  317. /sbin/ldconfig -v |grep "libdl.so"
  318. -v:
  319. 用此选项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字.
  320.  
  321. .使用libdl.so 库 位置:/usr/lib/libdl.so
  322. 动态库加载原理
  323. http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/
  324. -----------------------------------------------------------
  325. [root@monitor ~]# gcc test.c -m32 -o test
  326. [root@monitor ~]# ldd test
  327. linux-gate.so. => (0x00d28000)
  328. libc.so. => /lib/libc.so. (0x00194000) //C语言标准库
  329. /lib/ld-linux.so. (0x00ba3000)
  330.  
  331. [root@monitor ~]# /lib/ld-linux.so. ./test
  332.  
  333. -----------------------------------------------------------------
  334. [root@monitor ~]# gcc test.c -o test
  335. [root@monitor ~]# ldd test
  336. linux-vdso.so. => (0x00007fff629ff000)
  337. libc.so. => /lib64/libc.so. (0x0000003c4ec00000) //C语言标准库
  338. /lib64/ld-linux-x86-.so. (0x0000003c4e400000)
  339.  
  340. [root@monitor ~]# /lib64/ld-linux-x86-.so. ./test
  341. ------------------------------------------------------------------
  342.  
  343. 动态库中函数的查找已经封装成库libdl.so,用户写代码加载动态库
  344. dlopen 打开一个动态库 (flag:RTLD_LAZYRTLD_NOW)
  345. dlsym 在打开的动态库中找一个函数
  346. dlclose 关闭动态库
  347. dlerror
  348.  
  349. eg:
  350. dldemo.c :动态库用代码加载加载演示
  351. #include <dlfcn.h>
  352. main()
  353. {
  354. void *handle=dlopen("./libdemo4.so",RTLD_LAZY);
  355. void (*fun)(int)=dlsym(handle,"diamond");
  356. fun();
  357. dllclose(handle);
  358. }
  359.  
  360. gcc -dldemo.c -omain -ldl -L/usr/lib 没有指定-ldemo4
  361. gcc -dldemo.c -omain -ldl //-L/usr/lib 不指定也可以
  362. ./main
  363.  
  364. ldd main
  365. nm libdemo4.so 查函数列表
  366.  
  367. man:
  368. SYNOPSIS
  369. #include <dlfcn.h>
  370.  
  371. void *dlopen(const char *filename, int flag);
  372.  
  373. char *dlerror(void);
  374.  
  375. void *dlsym(void *handle, const char *symbol);
  376.  
  377. int dlclose(void *handle);
  378.  
  379. Link with -ldl.
  380.  
  381. 总结:
  382. 编绎连接动态库
  383. 使用动态库
  384. 怎么配置于让程序调用动态库
  385. 常握工具:nm ldd lddconfig objdump strip
  386.  
  387. eg:
  388. strip libdemo4.so 删除多的信息
  389. nm libdemo4.so
  390.  
  391. .工具make使用
  392. make 编绎脚本解释
  393. 编译脚本Makefile
  394.  
  395. make -f 脚本文件 目标
  396.  
  397. 脚本文件:
  398. .文本文件 demo.mk
  399. .语法
  400. 基本单位目标target
  401. 目标名:依赖目标
  402. \tab目标指令
  403. \tab目标指令
  404. \tab目标指令
  405. \tab目标指令
  406. ...
  407. --------------------------------------------------
  408. demo.mk
  409. ---------------------------------------------------
  410. demo:iotool.c graphic.c main.c
  411. gcc iotool.c -c //以tab健开始
  412. gcc graphic.c -c //以tab健开始
  413. gcc iotool.o graphic.o -shared -olibdemo.so //以tab健开始
  414. gcc main.c -ldemo -omain -L. //以tab健开始
  415. ----------------------------------------------------
  416. make -f demo.mk demo
  417. ----------------------------------------------------
  418. ./main
  419. ----------------------------------------------------
  420.  
  421. ldconfig命令:
  422.  
  423. ldconfig为在命令行中说明的目录或文件/etc/ld.so.config中指定的目录或一些可信任的目录
  424. (象/usr/lib, /lib)中的最新的动态连接库创建必要的连接和绶存。这些绶存起来的数据会被动态
  425. 连接器ld.so 或 ld-linux.so所使用。ldconfig会检查它所遇到的动态库文件的名称与版本号,
  426. 以决定那些动态库的连接要进行更新。
  427.  
  428. ldconfig会尝试推断ELF类型库(象libc5, libc6/glibc)是基于那一个版本的C库的。当然,在创建
  429. 动态库的时候,最好是明确的指定出使用C库(使用 -lc)
  430.  
  431. 一些已经存在的动态库的能提供的信息,不足以使ldconfig来推断出它们的类型。因此,/etc/ld.so.config
  432. 文件格式允许进行明确的说明。这只是对于我们不能计算出类型的ELF库才有用。文件的格式是"dirname=TYPE",
  433. TYPE可以是libc4, libc5, libc6. (这个语法在命令行上也可以使用). 空格是的禁止的。可以
  434. 参见-p 选项。ldconfig通常只能由超级管理员使用。因为它可能会修改一些root拥有的目录和文件。
  435.  
  436. 选项:
  437.  
  438. -v 详细模式。打印当前版本,扫描的目录,创建的连接。 覆盖安静模式。
  439.  
  440. -n 只处理在命令行上指定的目录。不处理可信息目录(/lib, 或 /usr/lib)和在 /etc/ld.so.config
  441. 中指定的目录。暗含 -N 选项
  442.  
  443. -N 不重建绶存。除非使用了 -X 选项,否则连接还是会更新的。
  444.  
  445. -X 不更新连接。除非使用了 -N 选项,否则绶存还是会更新的。
  446.  
  447. -f conf
  448. 使用conf 代替 /etc/ld.so.conf
  449.  
  450. -C cache
  451. 使用cache 代替 /etc/ld.so.cache
  452.  
  453. -r root
  454. 转换到并使用root
  455.  
  456. -l 库模式。手动连接单个库。 建议专家级才使用。
  457.  
  458. -p 打印在绶存中的目录和候选库。
  459.  
  460. 文件:
  461.  
  462. /lib/ld-linux.so.2
  463. 运行时库加载器
  464.  
  465. /etc/ld.so.conf
  466. 由逗号、空格、制表符、换行符或引号分隔的目录列表。ld将会在这些目录中查找连接库。
  467.  
  468. /etc/ld.so.cache
  469. 包含了在/etc/ld.so.conf中指定的目录中查找到所有连接库。按顺序存储。

在基于 GNU glibc 的系统上,包括所有 linux 系统,ELF 可执行二进制文件的运行自动导致程序加载器被加载并且运行。

在 linux 下,加载器是 /lib/ld-linux.so.X(X是版本号)。然后加载器搜索、加载程序所要使用的动态链接库。

被搜索的文件夹列表保存在文件 /etc/ld.so.conf 里。

在程序启动的时候搜索这些文件夹是很没有效率的,所以实际上使用缓存。ldconfig(8) 默认读取 /etc/ld.so.conf 文件,在 DLL 文件夹里创建合适的符号链接,在 /etc/ld.so.cache 里写入一个缓存。缓存大大加速了库的读取。所以,当一个 DLL 被添加、删除时,或DLL文件夹被改变时都需要运行 ldconfig 程序,当安装了一个新的 DLL 时,由软件包管理器自动运行 ldconfig。当程序启动时,装载器实际使用的是缓存。

------------------------------------------------------------------------------------------------------------------------------------------------------------

  1.  

1. 库的命名习惯

一个linux DLL 有三个不同名字的文件组成

soname 文件

  1.  
lib + 链接库名字 + .so + .版本号
  1.  

每当链接库接口改变时都递增版本号。soname 文件其实只是一个符号链接而已,指向他的real name 文件。

real name 文件

  1.  
lib + 链接库名字 + .so + .版本号.次版本号.发行号
  1.  

发行号是可选的。该文件包含实际代码。

linker name 文件

  1.  
lib + 链接库名字 + .so
  1.  

编译器以这个名字来请求指定的链接库。

当程序在内部列出所需要的链接库时,仅仅使用 soname。当你创建一个链接库时,使用 real name。安装一个新的链接库时,把它复制到一个DLL文件夹里,然后运行程序 ldconfig(8)。ldconfig 检查存在的 real name 文件,并且创建指向它的符号链接 soname 文件。ldconfig 还做一件事情就是建立 cache 文件 /etc/ld.so.cache

ldconfig 不会创建 linker name 文件,但是一般性 linker name 文件在安装链接库的时候创建。linker name 文件也只是一个符号链接,指向最新的 soname 文件或 real name 文件。建议指向 soname 文件,因为当你更新库以后,在编译器链接的时候,一般总是想使用新的库。

2. 库的放置

DLL 必须放置在文件系统的指定位置。多数开源软件遵守GNU 标准:当分发源代码的时候,库默认安装在 /usr/local/lib,命令安装在 /usr/local/bin。该标准还定义了如何重写这些默认标准以及如何调用安装程序。

Filesystem Hierarchy Standard(FHS) 规定:多数库应安装在 /usr/lib,启动时需要的库安装在 /lib,非系统库应安装在 /usr/local/lib

GNU 标准是针对开发人员的,FHS 是针对发行者的。

二、 库是如何被使用的

在基于 GNU glibc 的系统上,包括所有 linux 系统,ELF 可执行二进制文件的运行自动导致程序加载器被加载并且运行。在 linux 下,加载器是 /lib/ld-linux.so.X(X是版本号)。然后加载器搜索、加载程序所要使用的动态链接库。

被搜索的文件夹列表保存在文件 /etc/ld.so.conf 里。

在程序启动的时候搜索这些文件夹是很没有效率的,所以实际上使用缓存。ldconfig(8) 默认读取 /etc/ld.so.conf 文件,在 DLL 文件夹里创建合适的符号链接,在 /etc/ld.so.cache 里写入一个缓存。缓存大大加速了库的读取。所以,当一个 DLL 被添加、删除时,或DLL文件夹被改变时都需要运行 ldconfig 程序,当安装了一个新的 DLL 时,由软件包管理器自动运行 ldconfig。当程序启动时,装载器实际使用的是缓存。

环境变量

LD_LIBRARY_PATH
该变量里所指定的文件夹将会首先被搜索,然后才会搜索默认的 DLL 文件夹。该变量对开发和测试比较有用,但不应该为了给普通用户使用而设置。如果你不想设置该变量,在 linux 下你可以直接调用程序加载器,比如,你可以传递 PATH 参数给加载器代替该变量来运行程序:

  1.  
/lib/ld-linux.so.2 --library-path PATH EXECUTABLE
  1.  

不带参数执行加载器,可以得到更多帮助。但是,不要这样执行程序,仅供调试时使用。

LD_DEBUG
看名字就知道,是供调试使用的。该变量是dl*函数的开关,用来显示正在做的事情的详细信息。可以取值为:

  1.  
files 显示so文件的加载顺序
bindings 显示关于符号帮定的信息
libs 显示库搜索路径的信息
versions 显示版本依赖的信息
help 使用该值运行程序将会显示可用的选项
  1.  

三、创建动态链接库

  1.  

首先用 -fpic 或 -fPIC 选项创建要放入 DLL 中的目标文件。使用该选项生成的代码是位置无关的代码(DLL的必要条件)。使用 gcc 的 -Wl 选项传递 soname 参数给链接器。-Wl 选项里不能有未转义的 whitespace。使用如下命令创建 DLL:

  1.  
gcc -shared -Wl,-soname,your_soname /
    -o library_name file_list library_list
  1.  

举个例子:

  1.  
gcc -fPIC -g -c -Wall a.c
gcc -fPIC -g -c -Wall b.c
gcc -shared -Wl,-soname,libmystuff.so.1 /
    -o libmystuff.so.1.0.1 a.o b.o -lc
  1.  

该例子首先创建了两个与位置无关的目标文件 a.o、b.o,然后生成了一个包含两者的 DLL。注意:-g 选项使代码包含调试信息,-Wall 选项用来产生警告,两者并不是创建 DLL 必须的,但是建议加上。

不要 strip 所生成的 DLL,或使用编译器参数 -fomit-frame-pointer,这样做将会无法使用调试器。

-fPIC 选项总是可以使用,但生成的代码比使用 -fpic 的要大。-fpic 选项生成的代码比较小、快,但是有平台相关的限制,当创建 DLL 时,链接器将会告诉你是否符合限制。

链接器还有一个有用的选项 -rpath,可以用来指定程序在运行时搜索DLL时的路径,使用 gcc 时可以这样传递参数给链接器:

  1.  
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
  1.  

如果你使用了这个选项,就不用考虑 LD_LIBRARY_PATH 这个环境变量了。

  1.  
  1.  

四、安装、使用动态链接库

  1.  

1.安装在标准位置
最简单的安装方式是复制 DLL 到一个标准的 DLL 文件夹(/usr/lib等)并且运行 ldconfig(8),然后手动创建 linker name 符号链接。

2.安装在非标准位置
下面的命令将会在指定的文件夹里创建适当的 soname 符号链接。

  1.  
ldconfig -n directory_with_shared_libraries
  1.  

然后手动创建 linker name 文件指向 soname 文件。

  1.  

编译程序的时候使用 -l、-L 参数指定需要链接的库和库所在的位置。
除非使用 -rpath 参数指定过运行时库搜索路径,否则在运行时也必须指定。(所以在eclipse中运行称找不到liqwt.so.5)

  1.  

比如可以使用如下命令添加当前工作目录到 LD_LIBRARY_PATH 来运行程序:

  1.  
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  my_program
  1.  

ldd 命令可以用来查看程序的依赖,例如:

  1.  
ldd /bin/ls
  1. 输出的是 soname 列表
  2.  

C 高级编程3 静态库与动态库的更多相关文章

  1. (转)HelloWorld CMake CMake中构建静态库与动态库及其使用

    继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello ...

  2. C++高级编程2. 静态动态链接库

    C++高级编程2. 静态动态链接库20131018 1.动态链接库和静态链接库的区别: 静态链接库就是把lib文件中用到的函数代码直接连接进目标程序,程序运行的时候不在需要其他的库文件:动态链接库是把 ...

  3. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  4. iOS 静态库和动态库的区别&静态库的生成

    linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函 ...

  5. iOS 静态库,动态库与 Framework 浅析

    静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...

  6. Linux库函数制作(静态库、动态库)

    Linux库函数制作(静态库.动态库) 静态库与动态库 链接方式 链接分为两种:静态链接.动态链接 静态链接: 由链接器在链接时将库的内容加入到可执行程序中 静态链接的特点是: 优点: 对运行环境的依 ...

  7. linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

    主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考 ...

  8. 详解UE4静态库与动态库的导入与使用

    转自:http://blog.csdn.net/u012999985/article/details/71554628 一.基本内容概述   最近做项目时经常看到build.cs文件,就想研究一下UE ...

  9. Windows静态库和动态库的创建和使用

    偶们在实际的编程开发中,经常会遇到运行时无法找到某个DLL文件或者链接时无法找到某个LIB文件.然后,我们就开始乱GOOGLE一下,然后将VS2005的设置改变一下,或许就Ok了,我们将别人开发的DL ...

随机推荐

  1. Drawer Layout

    http://developer.android.com/training/implementing-navigation/nav-drawer.html#DrawerLayout <menu ...

  2. Delphi中编辑word

      其他(28)   //启动Word   try     wordapplication1.connect;   except     messagedlg('word may not be ins ...

  3. LoadRunner学习记录--Flights打开空白页的问题

    从网上查了一下,原因是PERL5LIB这个环境变量的原因. 担心修改环境变量会影响ORACLE的运行 在WebTour中修改run.bat   增加 set PERL5LIB=D:\oracle\pr ...

  4. cocos2d-x 详解之 CCTexture2D(纹理图片)和 CCTextureCache(纹理缓存)

    精灵和动画都涉及到纹理图片的使用,所以在研究精灵与动画之前,我们先来了解一下纹理图片类CCTexture2D和纹理缓存CCTextureCache的原理: 当一张图片被加载到内存后,它是以纹理的形式存 ...

  5. 45度地图遮挡问题解决方案(cocos2d-x)

    最近一直在做45度斜视角游戏,也就是isometric等容地图,俗称2.5D.地图上物体的前后遮挡是我遇到的第一个问题,总结一下处理方法. 遮挡问题(不知道术语),就是比如一个角色站在树后面,那么树要 ...

  6. mybatis系列-05-SqlMapConfig.xml详解

    mybatis的全局配置文件SqlMapConfig.xml,配置内容如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandler ...

  7. Spark系列(七)Master中的资源调度

    资源调度 说明: Application的调度算法有两种,分别为spreadOutApps和非spreadOutApps spreadOutApps 在spark-submit脚本中,可以指定要多少个 ...

  8. libsvm使用方法总结

    1.所需要软件下载: (1)libsvm(http://www.csie.ntu.edu.tw/~cjlin/libsvm/) (2)python (3)gnuplot 画图软件(ftp://ftp. ...

  9. CentOS 安装 Sun JDK

    1. 卸载原Open JDK 查看已安装包 rpm -qa | grep java 如果已经安装有Open JDK,可能会列出类似下面的内容: tzdata-java-2015e-.el6.noarc ...

  10. UVa12657 - Boxes in a Line(数组模拟链表)

    题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y ...