2020年10月18日 星期日

Linux基礎筆記

LIBRARY_PATH is used by gcc before compilation to search directories containing static and shared libraries that need to be linked to your program.

LD_LIBRARY_PATH is used by your program to search directories containing shared libraries after it has been successfully compiled and linked.

查看linux 版本

cat /proc/version 或者 uname -a

權限

sudo usermod -a -G wireshark user 將使用者加入應用程式的使用權限群組
more /etc/group
echo "$USE" 顯示本機使用者名稱
ping www.yahoo.com 可以看到該網站的ip位址

在Linux中找出command所在位置

若要找出make指令的實際存放位置,可以用which指令來取得:

user@user-Swift-SF315-51G:~/gst$ which make

/usr/bin/make

make在/bin目錄下。

Makefile選項CFLAGS,LDFLAGS,LIBS

CFLAGS 表示用於 C 編譯器的選項,
CXXFLAGS 表示用於 C++ 編譯器的選項。
這兩個變量實際上涵蓋了編譯和彙編兩個步驟。
CFLAGS: 指定頭文件(.h文件)的路徑,如:CFLAGS=-I/usr/include -I/path/include。同樣地,安裝一個包時會在安裝路徑下建立一個include目錄,當安裝過程中出現問題時,試著把以前安裝的包的include目錄加入到該變量中來。
LDFLAGS:gcc 等編譯器會用到的一些優化參數,也可以在裡面指定庫文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安裝一個包都幾乎一定的會在安裝目錄裡建立一個lib目錄。如果明明安裝了某個包,而安裝另一個包時,它愣是說找不到,可以抒那個包的lib路徑加入的LDFALGS中試一下。
LIBS:告訴鏈接器要鏈接哪些庫文件,如LIBS = -lpthread -liconv
簡單地說,LDFLAGS是告訴鏈接器從哪裡尋找庫文件,而LIBS是告訴鏈接器要鏈接哪些庫文件。不過使用時鏈接階段這兩個參數都會加上,所以你即使將這兩個的值互換,也沒有問題。
有時候LDFLAGS指定-L雖然能讓鏈接器找到庫進行鏈接,但是運行時鏈接器卻找不到這個庫,如果要讓軟件運行時庫文件的路徑也得到擴展,那麼我們需要增加這兩個庫給"-Wl,R":
LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
如果在執行./configure以前設置環境變量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib " ,注意設置環境變量等號兩邊不可以有空格,而且要加上引號(shell的用法)。那麼執行configure以後,Makefile將會設置這個選項,鏈接時會有這個參數,編譯出來的可執行程序的庫文件搜索路徑就得到擴展了。

pkg-config 使用及建立方法

1. pkg-config --list-all
列出所有可使用的連結庫,位置在/usr/lib/pkgconfig 及/usr/local/lib/pkgconfig 裏面的xxx.pc 檔,新軟體一般都會安裝.pc 檔,沒有可以自己建立,並且設定環境變數PKG_CONFIG_PATH 供pkg-config 尋找.pc 檔路徑。
2. pkg-config --cflags xxxx
取得該連結庫的 CFLAGS 參數。 (Cflags)
3. pkg-config --libs xxxx
取得該連結庫的 LDFLAGS 參數。 (Libs)
4. pkg-config --static xxxx
取得該連結庫供靜態連結的 LDFLAGS 參數。 (Libs.private)
5. pkg-config --exists xxx
假如連結庫存在則傳回 0。
6. pkg-config --version
取得 pkg-config 版本號。
7. pkg-config --atleast-pkgconfig-version=VERSION
假如 pkg-config 版本號大於等於 VERSION 則傳回 0。
8. pkg-config --errors-to-stdout
輸出 --print-errors 的錯誤訊息到 stdout 而非 stderr,需搭配 --print-errors 使用。
9. pkg-config --print-errors xxxx
假如連結庫不存在或有問題,則輸出相關錯誤訊息。 (好像不太對??)
10. pkg-config --print-requires xxxx
取得連結庫所需的相關連結庫。 (Requires)
11. pkg-config --modversion xxxxx
取得連結庫的版本號。 (Version)
12. pkg-config --variable=VARIABLENAME xxxx
取得連結庫 .pc 檔案內的變數值。 (prefix,exec_prefix,libdir,includedir)
13. .pc 檔案製作
# blkid pkg-config
# 註解
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include
#上面四個都是變數,視情況可自行增加
Name: blkid
Description: Block device id library
Version: 1.39
Requires: uuid devmapper
Cflags: -I${includedir}
Libs: -L${libdir} -lblkid -ldevmapper
Note that variable references are written "${foo}"; you can escape literal "${" as "$${".
Name: 連結庫名稱
This field should be a human-readable name for the package. Note that it is not the name passed as an argument to pkg-config.
Description: 連結庫描述
    This should be a brief description of the package
URL: 連結庫的來源網站
An URL where people can get more information about and download the package
Version: 連結庫版本
    This should be the most-specific-possible package version string.
Requires: 連結庫相依連結庫名稱
    This is a comma-separated list of packages that are required by your package. Flags from dependent packages will be merged in to the flags reported for your package. Optionally, you can specify the version of the required package (using the operators =, < , >, >=, <=); specifying a version allows pkg-config to perform extra sanity checks. You may only mention the same package one time on the Requires: line. If the version of a package is unspecified, any version will be used with no checking.
Conflicts: 連結庫相依連結庫版本限制
    This optional line allows pkg-config to perform additional sanity checks, primarily to detect broken user installations. The syntax is the same as Requires: except that you can list the same package more than once here, for example "foobar = 1.2.3, foob​​ar = 1.2.5, foobar >= 1.3", if you have reason to do so. If a version isn't specified, then your package conflicts with all versions of the mentioned package. If a user tries to use your package and a conflicting package at the same time, then pkg-config will complain.
Libs: 連結庫編譯所需的 LDFLAGS 參數
This line should give the link flags specific to your package. Don't add any flags for required packages; pkg-config will add those automatically.
Libs.private: 連結庫編譯所需的 LDFLAGS 參數,給靜態庫用的。
    This line should list any private libraries in use. Private libraries are libraries which are not exposed through your library, but are needed in the case of static linking.
Cflags: 連結庫編譯所需的 CFLAGS 參數
    This line should list the compile flags specific to your package. Don't add any flags for required packages; pkg-config will add those automatically.

LIBRARY_PATH在編譯前由gcc使用,用於搜索包含需要鏈接到程序的靜態庫和共享庫的目錄。
LD_LIBRARY_PATH成功編譯和鏈接後,程序將使用該程序搜索包含共享庫的目錄。
export LIBRARY_PATH=/opt/conda/:$LIBRARY_PATH

Linux常見目錄使用區別


usr 很多人都認為是user縮寫,其實不然,是unix system resource縮寫,*local* 目錄下的都不是系統預裝,而是手動編譯或者安裝的程序。

/usr/bin與/usr/local/bin區別
通常/usr/bin下面的都是系統預裝的可執行程序,會隨著系統升級而改變

/usr/local/bin目錄是給用戶放置自己的可執行程序的地方,推薦放在這裡,不會被系統升級而覆蓋同名文件

如果兩個目錄下有相同的可執行程序,誰優先執行受到PATH環境變量的影響,比如我的一台服務器的PATH變量為
echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dean/bin
這裡/usr/local/bin優先於/usr/bin, 一般都是如此。

/lib、/usr/lib、/usr/local/lib區別

/lib目錄都是為/bin, /sbin準備的,一般作為開發者不用關心
/lib是核心級的,/usr/lib是系統級的,/usr/local/lib是使用者級的.
/lib/ — 包含許多被 /bin/ 和 /sbin/ 中的程式使用的庫檔案。目錄 /usr/lib/ 中含有更多用於使用者程式的庫檔案。/lib目錄下放置的是/bin和/sbin目錄下程式所需的庫檔案。/lib目錄下的檔案的名稱遵循下面的格式:
libc.so.*
ld*

僅僅被/usr目錄下的程式所使用的共享庫不必放到/lib目錄下。只有/bin和/sbin下的程式所需要的庫有必要放到/lib目錄下。實際上,libm.so.*型別的庫檔案如果被是/bin和/sbin所需要的,也可以放到/usr/lib下。開發者需要關心下面的事情,一個應用程序啟動的時候,會在/lib 和 /usr/lib庫中查找動態庫,如果動態庫沒有放在此處,需要用環境變量LD_LIBRARY_PATH指定,就能在/usr/local/lib目錄中加載到自己放進去的動態庫。


目錄用途分類

/bin/ — 用來貯存使用者命令,在有的Unix和Linux系統中是/usr/bin的鏈接,不過UBuntu系統是兩個獨立的目錄。 /bin 存放系統管理員和普通用戶都要使用的程序。目錄 /usr/bin 也被用來貯存使用者命令。

/sbin/ — 許多系統命令(例如 shutdown)的貯存位置,存放用於系統恢復,系統啟動,系統維護等程序。目錄 /usr/sbin 中也包括了許多系統命令。

/root/ — 根使用者(超級使用者)的主目錄。

/mnt/ — 該目錄中通常包括系統引導後被掛載的檔案系統的掛載點。譬如,預設的光碟掛載點是 /mnt/cdrom/.

/boot/ — 包括核心和其它系統啟動期間使用的檔案。

/lost+found/ — 被 fsck 用來放置零散檔案(沒有名稱的檔案)。

/lib/ — 包含許多被 /bin/ 和 /sbin/ 中的程式使用的庫檔案。目錄 /usr/lib/ 中含有更多用於使用者程式的庫檔案。

/dev/ — 貯存裝置檔案。

/etc/ — 包含許多配置檔案和目錄。

/var/ — 用於貯存variable(或不斷改變的)檔案,例如日誌檔案和印表機假離線檔案。

/usr/ — 包括與系統使用者直接有關的檔案和目錄,例如應用程式及支援它們的庫檔案。

/usr/bin 登錄用戶可以使用的預裝程序一般都放在這裡

/usr/share/bin 可以通過web訪問的程序一般放在這裡

/proc/ — 一個虛擬的檔案系統(不是實際貯存在磁碟上的),它包括被某些程式使用的系統資訊。

/initrd/ — 用來在計算機啟動時掛載 initrd.img 映像檔案的目錄以及載入所需裝置模組的目錄。

警告:不要刪除 /initrd/ 目錄。如果你刪除了該目錄後再重新引導 Linux 時,你將無法引導你的計算機。

/tmp/ — 使用者和程式的臨時目錄。 /tmp 給予所有系統使用者讀寫權。

/home/ — 使用者主目錄的預設位置。

/opt/ — 可選檔案和程式的貯存目錄。該目錄主要被第三方開發者用來簡易地安裝和卸裝他們的軟體包。

This change was made to enable installing versions of the same library compiled for different architectures (e.g. on an AMD64 system, one version might go in /usr/lib/x86_64-linux-gnu while the other goes in i386-linux-gnu).

REF

沒有留言:

張貼留言