linux頭文件 庫,Linux操作系統的頭文件和庫文件搜索路徑

一、 頭文件

1 “”中的頭文件,在源文件當前目錄查找

2 -I 中指定目錄 -I可以在CFLAG中指定

3 gcc的環境變量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH

4 編譯器預設路徑、內定目錄:

/usr/include

/usr/local/include

/usr/lib/gcc-lib/i386-linux/2.95.2/include

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g -3

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

但是假如裝gcc的時候,有給定的prefix的話,那么就是

/usr/include

prefix/include

prefix/xxx-xxx-xxx-gnulibc/include

prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

此外還可用pkg-config 程序,用來在編譯腳本中向編譯器傳遞頭文件包含路徑或庫文件路徑。 Linux下那么多庫,在./configure時時怎么判斷它們存不存在的,難道是靠遞歸搜索?pkg-config這個命令和/*/lib/pkgconfig下的一些.pc文件才是主角。每個.pc文件定義了庫的名字、路徑、編譯選項等,比如glib-2.0.pc文件:

prefix=/usr

exec_prefix=${prefix}

libdir=/usr/lib

includedir=${prefix}/include

glib_genmarshal=glib-genmarshal

gobject_query=gobject-query

glib_mkenums=glib-mkenums

Name: Glib

Description: C Utilitiy Library

Version: 2.14.4

Libs: -L${libdir} -lglib-2.0

Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include

--cflags 參數可以給出在編譯時所需要的選項,而 --libs 參數可以給出連接時的選項

configure到某個庫的時候,pkg-config命令會首先去環境變量PKG_CONFIG_PATH定義好的路徑下搜索庫名字對應的.pc文件(庫名加.pc),找到了就行了,等會兒make的時候就可以通過正則表達式取出libs和cflags的值來使用。

如configure文件中有:

pkg_XLIB_CFLAGS='$PKG_CONFIG --cflags "x11" 2>/dev/null'(還是`***`)(結果是-I的形式)

(x11表示libx11庫),這些參數配置結束后寫入Makefile。

配置 pkgconfig

PKG_CONFIG_PATH 的缺省設置是 /lib/pkgconfig, /usr/lib/pkgconfig 和 /usr/local/lib/pkgconfig. 這些設置都是硬編碼的,所以不用另外設置它們。

二、 庫文件

? 編譯的時候動態庫的搜索路徑:

1 gcc會去找-L 指定的路徑和 -l指定的庫(指定庫的路徑)

2 由'-rpath-link'選項指定的搜索路徑 在LDFLAGS中gcc 的參數"-Wl,-rpath-link,-Wl"指定。 '-rpath-link'比‘-L’多一功能,指定的目錄還可用于搜索依賴庫。

3 由'-rpath'指定的搜索路徑. '-rpath'跟'-rpath_link'的不同之處在于,由'-rpath'指定的路徑被包含在可執行文件中,并在運行時使用, 而'-rpath-link'選項僅僅在連接時起作用.'-rpath'比'-rpath-link'多一功能,指定路徑編譯進程序,當程序運行時,首先從這些目錄中尋找庫。

4 再找內定目錄 /lib、 /usr/lib、 /usr/local/lib 這是當初compile gcc時寫在程序內的

'-rpath'跟'-rpath_link'用來指定依賴庫的路徑

? 對于交叉編譯,鏈接時庫搜索路徑及優先順序如下:

1 -rpath-link 指定

2 -rpath 指定

3 –L 指定

4 連接器的默認鏈接目錄,通常在交叉編譯器目錄下。

? 如何指定-rpath-link :在configure之前設置LDFLAGS,如

export LDFLAGS = " -Wl,-rpath-link -Wl,目錄/lib"(-Wl表示用于連接器)

在configure文件中也有:

pkg_XLIB_CFLAGS='$PKG_CONFIG --libs "x11" 2>/dev/null'(還是`***`)

? 運行時動態庫的搜索路徑

1?進程啟動時加載

首先 ?LD_PRELOAD

1、 -rpath指定目錄(在編譯目標代碼時指定程序的動態庫搜索路徑"-Wl,-rpath,"指定)

2、 通過環境變量LD_LIBRARY_PATH指定動態庫搜索路徑(當通過該環境變量指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔)

3、 /etc/ld.so.cache中指定的動態庫搜索路徑, 由ldconfig讀取配置文件/etc/ld.so.conf 生成。

4、 默認的動態庫搜索路徑/lib

5、 默認的動態庫搜索路徑/usr/lib

2? 運行時加載 dlopen()

第一個參數:指定共享庫的名稱,將會在下面位置查找指定的共享庫。

-/開頭,絕對路徑,名字必須完全匹配。

-環境變量LD_LIBRARY_PATH列出的用分號間隔的所有目錄。

-文件/etc/ld.so.cache中找到的庫的列表,用ldconfig維護。

-目錄usr/lib。

-目錄/lib。

-當前目錄。

第二個參數:指定如何打開共享庫。

其中flag有:RTLD_LAZY RTLD_NOW RTLD_GLOBAL,其含義分別為:

RTLD_LAZY:在dlopen返回前,對于動態庫中存在的未定義的變量(如外部變量extern,也可以是函數)不執行解析,就是不解析這個變量的地址。

RTLD_NOW:與上面不同,他需要在dlopen返回前,解析出每個未定義變量的地址,如果解析不出來,在dlopen會返回NULL,錯誤為:

: undefined symbol: xxxx.......

RTLD_GLOBAL:它的含義是使得庫中的解析的定義變量在隨后的隨后其它的鏈接庫中變得可以使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458968.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vs2010創建和使用動態鏈接庫(dll)

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** 本文將創建一個簡單的動態鏈接庫,并編寫一個應用臺控制程序使用該動態鏈接…

通用二進制

通用二進制 通用二進制(Universal binary)是蘋果電腦公司提出的一種程序代碼,使程序能以本地程序的形式運行在使用PowerPC或者英特爾微處理器(x86)的麥金塔電腦上,在同一個程序包中同時為兩種架構提供最理想…

Python~win32com~Excel

import win32com.client#wwin32com.client.Dispatch("Word.Application") #w.Visible1owin32com.client.Dispatch("Excel.Application") o.Visible1 o.Workbooks.Add() o.Cells(1,1).Value"Hello"轉載于:https://www.cnblogs.com/lynclynn/p/530…

linux顯示光盤命令行,使用wodim在命令行下燒錄光盤

使用wodim在命令行下燒錄光盤發布時間:2009-02-27 16:23:11來源:紅聯作者:zhania作者:linuxtoy出自http://linuxtoy.org/archives/burning-cd-with-wodim.html我們以前介紹的 Linux 光盤燒錄工具多為圖形化的程序,今天來看看如何使用 wodim 在命令行下燒…

Android(java)學習筆記144:網絡圖片瀏覽器的實現(ANR)

1.我們在Android下,實現使用http協議進行網絡通信,請求網絡數據。這里是獲取網絡上的圖片信息,讓它可以顯示在手機上; 但是我們這個手機連接網絡是很費時間,如果我們在主線程(UI線程)中寫這個網…

DLL導出函數名稱改編的解決方法

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** 1.DLL編譯后導出函數名稱改變 在編寫一個DLL后,為了能被別的程序調用&…

組合自定義控件的步驟詳解

Android 步驟&#xff1a; 1 自定義組合控件的布局settint_view.xml<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"and…

linux如何建立隱藏目錄,【Linux】文件與目錄的默認權限與隱藏權限

01. 文件默認權限&#xff1a;umask文件的權限可以使用chmod來改變&#xff0c;但是我們默認創建文件的權限是什么&#xff1f;那就是與umask這個有關了。下來我們學習這個指令1.1 簡單使用umask[rootiZbp13q6hd8z3xaagcmz6gZ /]# umask0022[rootiZbp13q6hd8z3xaagcmz6gZ /]# u…

Servlet和JSP學習指導與實踐(二):Session追蹤

前言&#xff1a; web應用中經常需要對某些有用的信息進行存儲或者附加一些信息。本文主要介紹session&#xff0c;即“會話”跟蹤的幾種不同方式~ ----------------------------4種管理session的方式&#xff1a; 1.重寫url 通過在請求的url后面追加參數信息進行會話跟蹤。如&…

數據存儲和界面展示(二)

#測試 黑盒測試 測試邏輯業務 白盒測試 測試邏輯方法 根據測試粒度 方法測試&#xff1a;function test 單元測試&#xff1a;unit test 集成測試&#xff1a;integration test 系統測試&#xff1a;system test 根據測試暴力程度 冒煙測試&#xff1a;smoke test 壓力測…

linux在A目錄下創建B文件,Linux課程---5、常用文件命令和目錄命令(創建文件命令)...

Linux課程---5、常用文件命令和目錄命令(創建文件命令)一、總結一句話總結&#xff1a;touch file11、管道符|有什么用&#xff1f;將前一個命令的結果作為后一個命令的輸入&#xff1a;比如查看文件前3行&#xff1a;cat file1 | head -32、linux下如何復制粘貼命令是什么&…

window 系統上傳文件到linux 系統出現dos 格式換行符

Windows里的文件在Unix/Mac下打開的話&#xff0c;在每行的結尾可能會多出一個^M符號&#xff0c;Unix/Mac系統下的文件在Windows里打開的話&#xff0c;所有文字會變成一行&#xff0c;所以為了避免這種情況的發生&#xff0c;我們可以在linux系統內轉換格式 Centos系列可以直…

#pragma once與 #ifndef的區別

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 為了避免同一個文件被include多次 1 #ifndef方式2 #pragma once方式 在能夠支持這…

android學習者優秀網址推薦

非常漂亮的android UI庫集合&#xff0c;別人整理的&#xff0c;如果感覺不錯&#xff0c;趕快收藏吧&#xff01;&#xff01; https://github.com/wasabeef/awesome-android-ui https://github.com/Trinea/android-open-project android中文社區網 http://www.android-studio…

linux while read文件,linux shell腳本用while read逐行讀取文本的問題

問題:我現在是想用一個腳本獲取一定列表服務器的運行時間。首先我建立一個名字為ip.txt的IP列表(一個IP一行)&#xff0c;再建好密鑰實現不用密碼直接登錄。然后寫腳本如下&#xff1a;#!/bin/bashwhile read ips;doecho $ips;done < ip.txt腳本實現了逐行讀取列表中的IP&am…

常用字符串處理函數匯總

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** (一)strcmp函數 strcmp函數是比較兩個字符串的大小,返回比較的結果。一般形式是&…

兼容性記錄-class屬性

getAttribute獲得class屬性時,IE6,IE7的傳參是className,IE7和現代游覽器都是class全部游覽器DOMElement均有的className屬性,其在IE各版本號下的均表現良好返回屬性class值的字符串此外html5中DOMElement有個classList屬性,它返回一個類型為DOMTokenList的對象,它當中有非常多…

magenta內核與linux,谷歌將推出新操作系統Fuchsia:Magenta語言為內核

谷歌現在研發出來并且推出使用的系統有Chrome OS、Android和Chromecasts&#xff0c;這三者在操作系統的市場中占得份額很高&#xff0c;但是好像谷歌對此并不滿意&#xff0c;因為有相關消息顯示&#xff0c;谷歌正在研發新的操作系統Fuchsia&#xff0c;該系統采用Magenta語言…

BZOJ 1968: [Ahoi2005]COMMON 約數研究 水題

1968: [Ahoi2005]COMMON 約數研究 Time Limit: 20 Sec Memory Limit: 256 MB 題目連接 http://www.lydsy.com/JudgeOnline/problem.php?id1968 Description Input 只有一行一個整數 N&#xff08;0 < N < 1000000&#xff09;。 Output 只有一行輸出&#xff0c;為整數M…

VC內存對齊準則(Memory alignment)

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 本文所有內容在建立在一個前提下&#xff1a;使用VC編譯器。著重點在于&#xff1a;VC…