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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章