标签:文件 gcc 复习 lib 编译 so Linux main
GCC
- 安装
sudo apt install gcc g++
- 查看版本
gcc/g++ -v/--version
- gcc常用参数选项
gcc编译选项 | 说明 |
---|---|
-E | 预处理指定的源文件,不进行编译 |
-S | 编译指定的源文件,但是不进行汇编 |
-c | 编译、汇编指定的源文件,但是不进行链接 |
-o [file1] [file2] / [file2] -o [file1] | 将文件 file2 编译成可执行文件 file1 |
-I directory | 指定 include 包含文件的搜索目录 |
-g | 在编译的时候,生成调试信息,该程序可以被调试器调试 |
-D | 在程序编译的时候,指定一个宏 |
-w | 不生成任何警告信息 |
-Wall | 生成所有警告信息 |
-On | n的取值范围:0~3。编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 |
-l | 在程序编译的时候,指定使用的库 |
-L | 指定编译的时候,搜索的库的路径。 |
-fPIC/fpic | 生成与位置无关的代码 |
-shared | 生成共享目标文件,通常用在建立共享库时 |
-std | 指定C方言,如:-std=c99,gcc默认的方言是GNU C |
库的制作
静态库
- 命名规则
- Linux下文件名为libxxx.a ,lib为固定前缀,.a为固定后缀,xxx为自定义库名。
- 制作
- gcc获得.o文件
- 将.o文件打包,使用ar工具
ar rcs libxxx.a xxx.o xxx.o
r - 将文件插入备存文件中
c - 建立备存文件
s - 索引
- 使用
使用gcc中的-l和-L指定使用制作好的静态库。(注意头文件预编译要用-I)
示例编译命令:
gcc main.c -o main -I ./include -l calc -L ./lib
注意上面使用的静态库文件名为libcalc.a
动态库
- 命名规则
- Linux下文件名为libxxx.so ,lib为固定前缀,.a为固定后缀,xxx为自定义库名。在Linux下位可执行文件。
- 制作
- gcc得到.o文件,得到和位置无关的代码
gcc -c -fpic/-FPIC file1.c file2.c - gcc得到动态库
gcc -shared file1.o file2.o -o libcalc.so
- gcc得到.o文件,得到和位置无关的代码
- 使用
如果使用和静态库文件一样的编译命令:
gcc main.c -o main -I ./include -l calc -L ./lib
然后执行生成的main程序时会发现报错:
这是因为系统找不到我们制作的动态库的位置,只需要将动态库加入到可以被ld-linux.so能搜索的地方即可。它先后搜索elf文件的DT_RPATH段 ——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib目录找到库文件后将其载入内存。./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
解决:- 添加环境变量
直接在命令行输入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<lib路径>
之后可以通过echo $LD_LIBRARY_PATH
查看环境变量是否修改成功,然后ldd main
查看能否找到库文件位置。
但是这种方法在关闭终端再重新打开后会失效,因为这是临时改变环境变量。
- 用户修改.bashrc
修改用户目录下的.bashrc
文件。在该文件最后一行加入刚才添加环境变量时的命令,保存退出后通过. ~/.bashrc
或source ~/.bashrc
使其生效。 - 系统修改profile
sudo修改/etc/profile
文件,在最后一行添加同样的命令后再保存退出后source。 - 有时可能需要重新打开终端使修改文件生效。
- 修改
/etc/ld.so.cache
文件
这个文件是二进制文件,需要通过修改/etc/ld.so.conf
文件间接配置。直接在文件内添加lib地址后保存退出然后运行sudo ldconfig
命令即可生效。 - 把库文件添加到库目录/lib/,/usr/lib下
不推荐,避免出现文件名冲突问题。
- 添加环境变量
标签:文件,gcc,复习,lib,编译,so,Linux,main 来源: https://www.cnblogs.com/fusheng-chana/p/15978142.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。