写在前面:最近因为需要在不同版本的linux上运行编译后的文件,经常会遇到找不到需要的链接库文件的问题,后来突然想起了静态编译这一说。
1:建静态库
/* hellos.h */
#ifndef _HELLO_S_H
#define _HELLO_S_H
void printS(char* str);
#endif
/* hellos.c */
#include "hellos.h"
void printS(char* str)
{
printf("print in static way: %s", str);
}
输入命令:
gcc -c -o hellos.o hellos.c
ar cqs libhellos.a hellos.o //ar是生成库的命令,cqs是参数, libhellos.a是生成的静态链接库须以lib开头,hellos是库名,a表示是静态链接库,hellos.o是刚才生成目标文件。于是得到了libhellos.a这么一个静态链接库
2:主程序
/* main.c */
#include <stdio.h>
#include "hellos.h"
main()
{
char* text = "Hello World!\n";
printS(text);
}
编译链接:
gcc -o hello main.c -static -L. –lhellos
下面是关于上面命令的解释:
库依赖
使用-I参数可以向gcc的头文件搜索路径中添加新目录。
gcc hello.c -I /home/wuzhiguo/include -o hello
使用-L参数可以向gcc的库文件搜索路径中添加新目录。
gcc hello.c -L /home/wuzhiguo/lib -l mylib -o hello
-l mylib 是指示gcc去链接库文件libmylib.so。Linux下的库文件有一个约定,全部以lib开头,因此可以省去lib。
动态库:.so结尾,在运行时加载。
静态库:.a结尾,在编译时加载。
默认gcc优先加载动态库,可以在通过-static选项强制使用静态链接库。
gcc hello.c -L /home/wuzhiguo/lib -static -l mylib -o hello
所以-L后面的点为当前目录,-l后面是要静态连接的库(libhellos.a)
然后运行hello可以看到输出
print in static way: Hello World!
删除libhellos.a和hellos.*后, 程序仍然正常运行。
下面再来看动态链接
3:建动态库
/* hellod.h */
#ifndef _HELLO_D_H
#define _HELLO_D_H
void printD(char* str);
#endif
/* hellod.c */
#include "hellod.h"
void printD(char* str)
{
printf("print in dynamic way: %s", str);
}
输入命令:
gcc -shared -o libhellod.so hellod.c
于是得到了libhellod.so这么一个动态链接库,然后复制到/lib目录中,否则运行的时候找不到库文件。
4:主程序
/* main.c */
#include <stdio.h>
#include "hellod.h"
main()
{
char* text = "Hello World!\n";
printD(text);
}
编译链接:
gcc -o hello main.c -L. -lhellod
然后运行hello可以看到输出
print in dynamic way: Hello World!
如果这时候删除刚刚生成的libhellod.so,再运行则会报告一个找不到libhellod.so的错误,程序无法正常运行。
gcc -g -lstdc++ -g -WI,-Bdynamic -L. -lmy -WI,-Bstatic -L. -lmy -o test.exe main.cc
分享到:
相关推荐
GCC编译动态和静态链接库.pdf 学习资料 复习资料 教学资源
转载的gcc编译方法,开发时老是忘记,作为资源吧,省得找了。
介绍gcc下常用的一些参数,包括预编译、编译、汇编和链接,以及优化和调试。静态链接与动态链接的内容。绝对原创!!
根据链接时期的不同,库又有静态库和动态库之分。 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。 有别于静态库,动态...
gcc编译动态和静态链接库.pdf,教你如何编译和使用库,提高程序的理解力
用GCC编译器制作静态库和动态库的方法简介。
stm32代码在ubuntu linux使用gcc编译的链接文件 link.ld 具体参考博客: http://blog.csdn.net/embbnux/
源码经过编译生成对象文件,对象文件进一步处理可以生成可执行程序或者库文件。...对于可执行程序和动态库,此“进一步处理”指的是“链接”,使用gcc命令。 对于静态库,此“进一步处理”指的是“打包”,使用ar命令。
这是最常规的解决办法,除此之外,只需要加入--start-group和--end-group两个链接参数,即可保持被依赖的库放在前头,也就是改成如下即可:g++ -g -o $@ -Wl,--start-group $^ -Wl,--end-group。 这里的“-Wl,”...
默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...
话说ISOC99有自己的一系列标准C函数库,例如我们熟悉的libc.a(包含标准I/O函数、字符串操作函数和整数数学函数)和libm.a(浮点数数学函数),可供我们在使用gcc编译工具编译程序时调用。那么,如果我们在日常学习...
在阅读本文之前,小编先给大家介绍一篇相关文章:Linux静态链接库使用类模板的快速排序算法 大家首先看下以上的文章对理解下面的知识点会有很大的帮助。 当模板遇到静态链接库会发生什么呢。 我们先按照常规思路去...
公司的入门培训,如何使用gcc如何进行编译,交叉编译
1. Linux 下静态链接库编译与使用 首先编写如下代码: // main.c #include test.h int main(){ test(); return 0; } // test.h #include using namespace std; void test(); // test.c #include test.h void test...
这是用于TDMGCC编译器的wxWidgets开发包,包含需要的静态库、动态库以及编译器相关的头文件。最近这些资源被河蟹了,大家下载起来不容易,所以打算就分享这些文件。使用方法:包含编译器相关头文件、wx头文件、指定_...
1.熟悉各种Linux操作命令;并编写程序,使用GNU gcc/g++进行...3)分别用静态链接和共享链接的方式测试向量的使用。 3.创建包含二维向量和三维向量的向量库:libVector.a和 libVector.so,并分别写出对应的MakeFile文件
在我们使用 gcc 的 Unix 下,我们可以将标志--whole-archive传递给链接器 ld,这使得 ld 不会丢弃任何对象。 在 Windows Visual Studio 下,没有等效于 GNU ld 的选项 --whole-archive。 链接器选项/ OPT:NOREF也...
aria2 version 1.33.1 ...Compiler: gcc 8.3.0 built by x86_64-pc-linux-gnu targeting arm-unknown-linux-gnu Report bugs to https://github.com/aria2/aria2/issues Visit https://aria2.github.io/
预处理 编译 汇编 链接 下面逐个使用 预编译:宏替换 ,文件引入 ,去除空行,注释,为编译做准备 预编译命令: gcc -E test.c -o test.i test.c中内容 #include int main(){ printf(“hello world!\n”); return 0; } -E...