c++构建工具之make使用小结
1.動態庫靜態庫的生成
編譯生成靜態庫步驟:
第一步,生成目標文件。
gcc -c test.c
第二步,把目標文件歸檔。
ar r libtest.a test.o
file libtest.a
編譯生成動態庫步驟:
???? gcc demo.c -fPIC -shared -o libtest.so
由以上命令生成動態庫libtest.so,為了不需要動態加載動態庫,在命令時需以lib開頭以.so為后綴。
–fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
–shared:指明編譯成動態庫。
2.動態庫靜態庫的鏈接
編譯鏈接靜態庫
? gcc demo.c -ltest -L. -static -o demo
編譯鏈接動態庫
? gcc test.c –L . –ltest –o test
??????? -L:指明動態庫所在的目錄
??????? -l:指明動態庫的名稱,該名稱是處在頭lib和后綴.so中的名稱,如上動態庫libtest.so的l參數為-l test。
-ltest -L./lib 指定鏈接庫路徑
-wl,-rpath /home/Tim/demo/lib 指定搜索鏈接庫路徑
-wl,-Bstatic 后面的-l使用靜態庫鏈接
-wl,-Bdynamic 后面的-l使用動態庫連接
顯式加載與隱式加載
顯式加載通過編譯是鏈接符號表,運行時由系統搜索加載動態庫
隱式加載通過程序運行時調用下面幾個系統調用手動加載動態庫
dlopen 用于庫的打開
dlerror 用于錯誤檢測
dlsym 用于獲取庫中函數指針
dlclose 關閉動態庫,手動加載動態庫
3.動態庫靜態庫的加載
ldd test 查看執行程序的動態庫依賴
nm libtest.so 查看動態庫的符號
strings libtest.so 查看動態庫中字符串
strip libtest.so 脫去動態庫中符號信息
sudo lsof -p pid 查看運行進程的動態庫依賴
env 查看當前shell用戶環境變量
sudo env 查看切換sudo環境變量
export ld_library_path 配置動態庫路徑
pkg-config 配置搜索動態庫路徑命令
vi /etc/profile 配置環境變量到系統配置文件
source /etc/profile 使系統配置文件立即生效
vi ld.so.conf 查看系統動態庫共享目錄配置
sudo ldconfig 使系統動態庫共享目錄生效
sudo visudo 修改執行sudo切換時保留當前用戶shell環境
sudo cat /etc/sudoers
Defaults??????? env_keep+="ld_library_path"
4.參考資料
http://man.linuxde.net/ldconfig
http://blog.chinaunix.net/uid-24641004-id-5028821.html
https://www.cnblogs.com/zhangsir6/articles/2956798.html
總結
以上是生活随笔為你收集整理的c++构建工具之make使用小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++构建工具之xmake使用实例
- 下一篇: c++构建工具之cmake使用小结