GUN.g++
1.基本编译
基本编译将用一个例子说明g++的基础使用,静态库、动态库的生成。除了使用到g++命名,还会涉及到av(打包),ldd(查看链接)命令。例子如下(文件在cpp/GUN.g++.1/):
speak.h:
#pragma once
void hello();
void sing();
say.cpp:
#include <iostream>
#include "speak.h"
using namespace std;
void hello(){
cout<<"say hello!"<<endl;
}
sing.cpp:
#include <iostream>
#include "speak.h"
using namespace std;
void sing(){
cout<<"Happy birthday to you"<<endl;
}
main.cpp:
#include "speak.h"
int main(){
hello();
sing();
}
-o -c编译运行
g++ -c main.cpp say.cpp
g++ -o main main.o say.o
./main
静态库编译
-I(大写i) -l(小写L) -L可以附加静态库、动态库
-I(大写i){path}设置头文件查找路径,如果#include<head.h>,则会默认在/user/include中搜索,使用-l{path}设置额外的头文件搜索路径。例如g++ -o main.cpp say.cpp -l./表示为在本文件中查找。
-l(小写L ){lib name} 设置库文件,若库为libm.a,则-lm
-L{path} 设置库文件查找路径,同-I
g++ -c say.cpp
ar rc libsay.a say.o
#或者g++ -o main main.cpp -L./ -lsay
g++ -o main main.cpp libsay.a
av打包
ar命令用于创建库(打包文件),ar命令可以用来创建、修改库,也可以从库中提出单个模块,详细使用(加入新成员、列出)在https://blog.csdn.net/u013571243/article/details/49619067 ,例如上例子
参 数
指令参数
-d 删除库文件中的成员文件
-m 变更成员文件在库文件中的次序
-p 显示库文件中的成员文件内容
-q 将问家附加在库文件末端
-r 将文件插入库文件中
-t 显示库文件中所包含的文件
-x 自库文件中取出成员文件
选项参数
a <成员文件> 将文件插入库文件中指定的成员文件之后
b <成员文件> 将文件插入库文件中指定的成员文件之前
c 建立库文件
f 为避免过长的文件名不兼容于其他系统的ar指令指令,因此可利用此参数,截掉要放入库文件中过长的成员文件名称
i <成员文件> 将问家插入库文件中指定的成员文件之前
o 保留库文件中文件的日期
s 若库文件中包含了对象模式,可利用此参数建立备存文件的符号表
S 不产生符号表
u 只将日期较新文件插入库文件中
v 程序执行时显示详细的信息
V 显示版本信息
动态库编译
#-shared生成动态库, -fPIC编译为位置独立代码
g++ say.cpp sing.cpp -fPIC -shared -o libsay.so
# 或者
g++ -c say.cpp sing.cpp
g++ -shared -fPIC -o libsay.so say.o sing.o
g++ -o main main.cpp -L. -lsay
#可以通过ldd查看链接情况,会提示libsay.so找不到,原因下下面讲到
ldd main
注意:如果运行.main是为提示"error while loading shared libraries: libsay.so: cannot open shared object file: No such file or directory"的,应为链接器ld默认的查找位置是在/lib和/usr/lib中(如果吧libsay.so拷贝到/lib或者/usr/lib中即可以运行,也可以用ldd找到动态库的位置),也可以通过以下方法注册动态库
注册动态库
1.修改ld.so.conf
编辑/etc/ld.so.conf在新的一行中加入库文件所在目录,例如/home/Desktop/demo/,运行sudo ldconfig以更新/etc/ld.so.cache文件
2.新建.conf文件
在/etc/ld.so.conf.d/目录中新建一个以.conf为后缀名的文件,在该文件中加入库所在目录,运行sudo ldconfig
3.环境变量
设置bash的LD_LIBRARY_PATH值,运行export LD_LIBRARY_PATH="/home/charles/Desktop/demo/"
或者
编译时指定动态库的位置
通过-Wl,-rpath=sopath 指定动态库的位置
例如上例,libsay.so在./目录,则:
g++ -o main main.cpp -L. -lsay -Wl,-rpath=./