當前位置:首頁 » 編程軟體 » gcc編譯時動態庫查找路徑

gcc編譯時動態庫查找路徑

發布時間: 2022-09-27 21:44:08

1. gcc編譯指定了庫路徑,但是還是找不到

看起來它不是個庫,倒像是個可執行程序
一般so都放在lib這樣的目錄下,你這個是bin,而且和它在一起的都是可執行程序,並且它沒有so後綴名。

2. 為啥各種系統庫的頭文件都找不到

頭文件:
1. #include 「headfile.h」
搜索順序為:
①先搜索當前目錄
②然後搜索-I指定的目錄
③再搜索gcc的環境變數CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)
④最後搜索gcc的內定目錄
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include

各目錄存在相同文件時,先找到哪個使用哪個。
2. #include <headfile.h>
①先搜索-I指定的目錄
②然後搜索gcc的環境變數CPLUS_INCLUDE_PATH
③最後搜索gcc的內定目錄
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include

與上面的相同,各目錄存在相同文件時,先找到哪個使用哪個。這里要注意,#include<>方式不會搜索當前目錄!

這里要說下include的內定目錄,它不是由$PATH環境變數指定的,而是由g++的配置prefix指定的(知道它在安裝g++時可以指定,不知安裝後如何修改的,可能是修改配置文件,需要時再研究下):
-bash-3.2$ g++ -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)

在安裝g++時,指定了prefix,那麼內定搜索目錄就是:
Prefix/include
Prefix/local/include
Prefix/lib/gcc/--host/--version/include
編譯時可以通過-nostdinc++選項屏蔽對內定目錄搜索頭文件。

庫文件:
編譯的時候:
①gcc會去找-L
②再找gcc的環境變數LIBRARY_PATH
③再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內的(不可配置的?)

運行時動態庫的搜索路徑:
動態庫的搜索路徑搜索的先後順序是:
①編譯目標代碼時指定的動態庫搜索路徑(這是通過gcc 的參數"-Wl,-rpath,"指定。當指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔)
②環境變數LD_LIBRARY_PATH指定的動態庫搜索路徑(當通過該環境變數指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔)
③配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
④默認的動態庫搜索路徑/lib;
⑤默認的動態庫搜索路徑/usr/lib。
(應注意動態庫搜尋路徑並不包括當前文件夾,所以當即使可執行文件和其所需的so文件在同一文件夾,也會出現找不到so的問題,類同#include <header_file>不搜索當前目錄)

3. 如何指定gcc的默認頭文件路徑

gcc指定頭文件路徑及動態鏈接庫路徑

本文詳細介紹了Linux 下gcc頭文件指定方法,以及搜索路徑順序的問題。另外,還總結了,gcc動態鏈接的方法以及路徑指定,同樣也討論了搜索路徑的順序問題。本文包含了很多的例子,具有很強的操作性,希望讀者自己去走一遍。
一.#include <>與#include 「」
#include <>直接到系統指定的某些目錄中去找某些頭文件。
#include 「」先到源文件所在文件夾去找,然後再到系統指定的某些目錄中去找某些頭文件。
二.gcc指定頭文件的三種情況:
1.會在默認情況下指定到/usr/include文件夾(更深層次的是一個相對路徑,gcc可執行程序的路徑是/usr/bin/gcc,那麼它在實際工作時指定頭文件頭徑是一種相對路徑方法,換算成絕對路徑就是加上/usr/include,如#include 就是包含/usr/include/stdio.h)
2.GCC還使用了-I指定路徑的方式,即
gcc -I 頭文件所在文件夾(絕對路徑或相對路徑均可) 源文件
舉一個例子:
設當前路徑為/root/test,其結構如下:
include_test.c
include/include_test.h
有兩種方法訪問到include_test.h。
1. include_test.c中#include 「include/include_test.h」然後gcc include_test.c即可
2. include_test.c中#include 或者#include 然後gcc –I include include_test.c也可
3. 參數:-nostdinc使編譯器不再系統預設的頭文件目錄裡面找頭文件,一般和-I聯合使用,明確限定頭文件的位置。
在編譯驅動模塊時,由於非凡的需求必須強制GCC不搜索系統默認路徑,也就是不搜索/usr/include要用參數-nostdinc,還要自己用-I參數來指定內核頭文件路徑,這個時候必須在Makefile中指定。
頭文件搜索順序:
1.由參數-I指定的路徑(指定路徑有多個路徑時,按指定路徑的順序搜索)
2.然後找gcc的環境變數 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
3.再找內定目錄
/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
三.Linux指定動態庫路徑
眾所周知,Linux動態庫的默認搜索路徑是/lib和/usr/lib。動態庫被創建後,一般都復制到這兩個目錄中。當程序執行時需要某動態庫, 並且該動態庫還未載入到內存中,則系統會自動到這兩個默認搜索路徑中去查找相應的動態庫文件,然後載入該文件到內存中,這樣程序就可以使用該動態庫中的函 數,以及該動態庫的其它資源了。在Linux 中,動態庫的搜索路徑除了默認的搜索路徑外,還可以通過以下三種方法來指定。
1.在配置文件/etc/ld.so.conf中指定動態庫搜索路徑。
可以通過編輯配置文件/etc/ld.so.conf來指定動態庫的搜索路徑,該文件中每行為一個動態庫搜索路徑。每次編輯完該文件後,都必須運行命令ldconfig使修改後的配置生效。
舉一個例子:
所有源文件:
源文件1: lib_test.c
#include
void prt()
{
printf(「You found me!!!/n」);
}
源文件2: main.c
void prt();
int main()
{
prt();
return 0;
}

4. gcc編譯時默認使用的庫在哪個目錄

看你包含的
頭文件
和使用的函數啊~兩者包含的函數不一樣~
你要是使用fopen/memcpy等等這樣標准C的函數,當然會在鏈接時使用到標准C庫(ANSI
C),如果你使用了read/write這些glibc庫實現的函數,肯定就在鏈接時使用到glibc庫~
具體使用了什麼庫,要看你調用的函數了~可能不會僅僅只包含一個庫~
Linux下,庫的路徑一般是:/lib,/usr/lib,/usr/local/lib等,這些路徑一般會在/etc/ld.so.conf
中標記出來,如果需要添加特殊位置的庫,可以把庫的路徑添加到/etc/ld.so.conf中去,並且執行ldconfig來使得新路徑立即生效~

5. linux下gcc編譯生成動態庫的路徑是怎樣的

#include "stdio.h"
void test_a();
void test_b();
void test_c();

//test_a.c:
#include "so_test.h"
void test_a()
{
printf("this is in test_a...\n");
}

//test_b.c:
#include "so_test.h"
void test_b()
{

6. gcc編譯時默認使用的庫在哪個目錄(是標准C庫,還是glibc庫 )

看你包含的頭文件和使用的函數啊~兩者包含的函數不一樣~
你要是使用fopen/memcpy等等這樣標准C的函數,當然會在鏈接時使用到標准C庫(ANSI C),如果你使用了read/write這些glibc庫實現的函數,肯定就在鏈接時使用到glibc庫~

具體使用了什麼庫,要看你調用的函數了~可能不會僅僅只包含一個庫~

Linux下,庫的路徑一般是:/lib,/usr/lib,/usr/local/lib等,這些路徑一般會在/etc/ld.so.conf 中標記出來,如果需要添加特殊位置的庫,可以把庫的路徑添加到/etc/ld.so.conf中去,並且執行ldconfig來使得新路徑立即生效~

http://linux.die.net/man/8/ldconfig

7. gcc怎麼查看它的默認include路徑和庫的路徑

看下文的紅色部分。 有大量的環境變數可供設置以影響 GCC 編譯程序的方式。利用這些變數的控制也可使用合適的命令行選項。一些環境變數設置在目錄名列表中。這些名字和 PATH 環境變數使用的格式相同。特殊字元 PATH_SEPARATOR

8. mac os x gcc編譯指定該程序的動態庫搜索路徑

和linux里是一樣的,工具鏈是差不多的

9. gcc編譯指定了庫路徑,但是還是找不到

不同版本的動態庫是為了升級方便,舊的程序需要與舊的庫鏈接,新的程序與新的. 一般的做法是把libabc.so連接(symbolic link, ln -s libabc.so.N libabc.so)到最新的版本,這樣以後的新程序,在用gcc -labc的時候,都會鏈接到新的版本

熱點內容
IDE和腳本 發布:2022-11-29 23:02:19 瀏覽:970
c語言列印空格 發布:2022-11-29 22:59:39 瀏覽:12
比較強大的編譯器 發布:2022-11-29 22:58:47 瀏覽:425
linux搭建內網郵件伺服器 發布:2022-11-29 22:58:39 瀏覽:680
python命名規則 發布:2022-11-29 22:54:47 瀏覽:886
如何給exe文件加密 發布:2022-11-29 22:53:57 瀏覽:694
公司內部搭建文件伺服器 發布:2022-11-29 22:53:50 瀏覽:132
dosedit編譯命令 發布:2022-11-29 22:42:32 瀏覽:616
axu資料庫 發布:2022-11-29 22:42:15 瀏覽:572
買車要注意哪些假配置 發布:2022-11-29 22:41:31 瀏覽:967