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