GCC实现多文件编译,静态库,动态库

一 代码

//add.h

int add(int a, int b);

//add.c

int add(int a, int b)

{

return a+b;

}

//main.c

#include <stdio.h>

#include "add.h"

void main()

{

printf("3 + 2 = %d\n",add(3+2));

}

二 多文件编译

1 生成.o文件

命令:gcc -c add.c main.c

生成:add.o,main.o

2 生成可运行文件

命令:gcc -o main add.o main.o

生成:main

3 执行

命令:./main

输出:3 + 2 = 5

二 静态库

1 生成.o文件

命令:gcc -c add.c

生成:add.o

2 生成libxxx.a

命令:ar rcs libadd.a add.o

生成:libadd.a

3 生成可运行文件

命令:gcc -o main main.c -static -L. -ladd

生成:main

4 执行

命令:./main

输出:3 + 2 = 5

三 动态库

1 生成.o文件

命令:gcc -c add.c

生成:add.o

2 生成libxxx.so

命令:gcc -shared -fPIC -o libadd.so add.o

生成:libadd.so

3 动态库路径

方法一:将文件拷贝到文件夹/usr/lib中

命令:mv libadd.so /usr/lib

方法二:设置LD_LIBRARY_PATH为当前文件夹

命令:export
LD_LIBRARY_PATH=$(pwd)

4 生成可运行文件

命令:gcc -o main main.c -L. -ladd

生成:main

#假设没有第3步。会报错:找不到libadd.so

5 执行

命令:./main

输出:3 + 2 = 5

四 Makefile文件

#mf:mult file

#liba: liaxxx.a

#libso:libxxx.so

run:main

./main

mfo:add.c main.c

gcc -c add.c main.c

mfe:mfo

gcc -o main add.o main.o

libo:add.c

gcc -c add.c

liba:libo

ar rcs libadd.a add.o

libae:liba

gcc -o main main.c -static -L. -ladd

libso:libo

gcc -shared -fPIC -o libadd.so add.o

libsoe:libso

export LD_LIBRARY_PATH=$(pwd)

gcc -o main main.c -L. -ladd

时间: 2024-10-18 13:43:51

GCC实现多文件编译,静态库,动态库的相关文章

gcc编译工具生成动态库和静态库之一----介绍

 1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链接阶段到底做了什么) 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已.因为静态库被链接后

C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

目录 0. 引言 1. 交叉编译 2. Cygwin简介 3. 静态库编译及使用 4. 动态库编译及使用 5. MinGW简介 6. CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够被授权使用的一个操作系统.linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打造的一个操作系统.为什么linux和unix之间有很多软件可以很轻松的移植?因为linux也满足POSIX规范,所以在运行机制上跟unix相近.同时,POSI

修改OpenSSL默认编译出的动态库文件名称

在 Windows 平台上调用动态链接库 dll 文件时,有两种方式:a) 隐式的加载时链接:使用 *.lib (导入库)文件,在 IDE 的链接器相关设置中加入导入库 lib 文件的名称,或在程序中加入预编译指令 #pragma comment (lib,”*.lib”).b) 显式的运行时链接.不使用 *.lib (导入库)文件,使用 Load Library(),GetProcAddress() 函数来加载动态库中的函数.要注意的是在导入库 lib 文件内部包含了其对应 dll 文件的名称

Ubuntu下makefile及gcc生成静态库动态库的简单使用举例

环境:Ubuntu-13.10  32位(虚拟机).gcc4.8.1 首先创建一个test_makefile_gcc文件夹,此test_makefile_gcc文件夹下包括:src文件夹用于存放源文件: include文件夹用于存放头文件:bin文件夹用于存放生成的动态库.so文件:lib文件夹用于存放生成的静态库.a文件:project_makefile文件夹存放此工程的makefile文件:test文件夹存放用来测试静态库和动态库的源文件:另外在test_makefile_gcc文件夹下还包

C++开发新版本vs使用旧版本vs编译的静态库动态库

关于vs潜在的升级问题概述 (Visual C++)查看官网的介绍:潜在的升级问题概述 (Visual C++).主要问题: 1. 如果使用 /GL(全程序优化)进行编译,则生成的对象文件只能使用生成它时所用的同一工具集进行链接.即若在编译静态库时开启了全程序优化,那么编译出的静态库不可移植. 2. 在 Visual Studio 2013 及更低版本中,不能保证使用不同编译器工具集和运行时库版本生成的对象文件 (OBJ).静态库 (LIB).动态库 (DLL) 和可执行文件 (EXE) 之间的

018_C语言静态库动态库

 linux下C语言编程环境 头文件目录:/usr/include/ 库目录:/usr/lib/ 动态库与静态库的区别:在计算机程序源代码需要通过翻译.汇编.链接过程而生成可执行文件,再由加载器加载到内存,两者区别就在于程序加载时链接到相应库的方式不同,程序编译时指定了静态库,编译后可直接运行,而编译时指定动态库时,编译后还要先指定库的路径. 静态库: ar -rs libmy_math.a *.o 生成静态库libmy_math.a ar -t 查看静态库 gcc test.c -L. -

Linux 静态库&amp;动态库调用

1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不兼容的.本文仅限于介绍linux下的库.2.库的种类linux下的库有两种:静态库和共享库(动态库).二者的不同点在于代码被载入的时刻不同.静态库的代码在编译过程中已经被载入可执行程序,因此体积较大.共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小.3.库存在

静态、动态库制作使用

本质 库是一种可执行代码的二进制格式,可以被载入内存中执行 库分静态库和动态库两种. 一.概念 静态函数库 库的名字一般是libxxx.a 函数库的链接是在编译时期完成 所有相关对象与牵涉的函数库被链接合成一个可执行文件 运行时,与函数库再无瓜葛 动态函数库 库的名字一般是libxxx.so 函数库的链接是在运行时期完成 运行时,在运行环境中必须有相应的库 二.优缺点 静态函数库缺点 文件较大,浪费空间 库或者程序一方改变都使得重新编译 动态函数库优点 文件较小,节省空间. 库具有公用性,内存中

windows库的创建和使用:静态库+动态库

windows库的创建和使用:静态库+动态库 一.静态库的创建和使用 1. 静态库创建 (1)首先创建工程test,测试代码如下: 1) test.h void test_print(); 2) test.cpp #include "test.h" #include <stdio.h> void test_print() { printf("test_print in static lib."); } 3)右击工程test:属性-->配置属性--&