GNU.G++

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=./

对象封装

https://blog.csdn.net/tspangle/article/details/39501853

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值