成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

編譯代碼時動態地鏈接庫

開發
編譯軟件在你如何運行你的系統方面給你很大的靈活性。LD_LIBRARY_PATH 變量,以及 GCC 的 -L 和 -l 選項,是這種靈活性的組成部分。

編譯軟件是開發者經常做的事情,在開源世界中,一些用戶甚至選擇自己動手。Linux 播客 Dann Washko 稱源碼為“通用包格式”,因為它包含了使一個應用在任何平臺上運行所需的所有組件。當然,并不是所有的源碼都是為所有的系統編寫的,所以它只是在目標系統的子集內是“通用”的,但問題是,源碼是非常靈活的。有了開源,你可以決定代碼的編譯和運行方式。

當你在編譯代碼時,你通常要處理多個源文件。開發人員傾向于將不同的類或模塊放在不同的文件中,這樣它們可以被單獨維護,甚至可能被不同的項目使用。但當你編譯這些文件時,許多文件會被編譯成一個可執行文件。

這通常是通過創建共享庫來完成的,然后從可執行文件中動態鏈接回它們。這樣可以通過保持模塊化功能的外部性來保持可執行文件的小型化,并確保庫可以獨立于使用它們的應用而被更新。

在編譯過程中定位一個共享對象

當你 用 GCC 編譯? 時,你通常需要在你的工作站上安裝一個庫,以便 GCC 能夠定位到它。默認情況下,GCC 假定庫在系統庫路徑中,例如 /lib64? 和 /usr/lib64。然而,如果你要鏈接到一個你自己的尚未安裝的庫,或者你需要鏈接到一個沒有安裝在標準位置的庫,那么你必須幫助 GCC 找到這些文件。

有兩個選項對于在 GCC 中尋找庫很重要:

  • -L(大寫字母 L)在 GCC 的搜索位置上增加一個額外的庫路徑。
  • -l(小寫字母 L)設置你要鏈接的庫的名字。

例如,假設你寫了一個叫做 libexample.so? 的庫,并且你想在編譯你的應用 demo.c? 時使用它。首先,從 demo.c 創建一個對象文件:

$ gcc -I ./include -c src/demo.c

-I? 選項在 GCC 搜索頭文件的路徑中增加了一個目錄。在這個例子中,我假設自定義頭文件在一個名為 include? 的本地目錄中。-c 選項防止 GCC 運行鏈接器,因為這個任務只是為了創建一個對象文件。結果如下:

$ ls
demo.o include/ lib/ src/

現在你可以使用 -L 選項為你的庫設置一個路徑,然后進行編譯:

$ gcc -L`pwd`/lib -o myDemo demo.o -lexample

注意,-L? 選項在 -l? 選項之前。這很重要,因為如果在你告訴 GCC 查找非默認庫之前沒有將 -L 添加到 GCC 的搜索路徑中,GCC 就不知道要在你的自定義位置上搜索。編譯成功了,但當你試圖運行它時,卻出現了問題:

$ ./myDemo
./myDemo: error while loading shared libraries:
libexample.so: cannot open shared object file:
No such file or directory

用 ldd 排除故障

ldd 工具可以打印出共享對象的依賴關系,它在排除類似問題時很有用:

$ ldd ./myDemo
linux-vdso.so.1 (0x00007ffe151df000)
libexample.so => not found
libc.so.6 => /lib64/libc.so.6 (0x00007f514b60a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f514b839000)

你已經知道定位不到 libexample?,但 ldd? 輸出至少確認了它對工作庫的期望位置。例如,libc.so.6?已經被定位,ldd 顯示其完整路徑。

LD_LIBRARY_PATH

LD_LIBRARY_PATH 環境變量? 定義了庫的路徑。如果你正在運行一個依賴于沒有安裝到標準目錄的庫的應用程,你可以使用 LD_LIBRARY_PATH 添加到系統的庫搜索路徑。

有幾種設置環境變量的方法,但最靈活的是在運行命令前放置環境變量。看看設置 LD_LIBRARY_PATH? 對 ldd 命令在分析一個“損壞”的可執行文件時的作用:

$ LD_LIBRARY_PATH=`pwd`/lib ldd ./
linux-vdso.so.1 (0x00007ffe515bb000)
libexample.so => /tmp/Demo/lib/libexample.so (0x0000...
libc.so.6 => /lib64/libc.so.6 (0x00007eff037ee000)
/lib64/ld-linux-x86-64.so.2 (0x00007eff03a22000)

這也同樣適用于你的自定義命令:

$ LD_LIBRARY_PATH=`pwd`/lib myDemo
hello world!

然而,如果你移動庫文件或可執行文件,它又會失效:

$ mv lib/libexample.so ~/.local/lib64
$ LD_LIBRARY_PATH=`pwd`/lib myDemo
./myDemo: error while loading shared libraries...

要修復它,你必須調整 LD_LIBRARY_PATH 以匹配庫的新位置:

$ LD_LIBRARY_PATH=~/.local/lib64 myDemo
hello world!

何時使用 LD_LIBRARY_PATH

在大多數情況下,LD_LIBRARY_PATH? 不是你需要設置的變量。按照設計,庫安裝到 /usr/lib64? 中,因此應用自然會在其中搜索所需的庫。在兩種情況下,你可能需要使用 LD_LIBRARY_PATH:

  • 你正在編譯的軟件需要鏈接到本身剛剛編譯但尚未安裝的庫。良好設計的構建系統,例如Autotools? 和CMake,可以幫助處理這個問題。
  • 你正在使用設計為在單個目錄之外運行的軟件,它沒有安裝腳本,或安裝腳本將庫放置在非標準目錄中。一些應用具有 Linux 用戶可以下載、復制到/opt? 并在“不安裝”的情況下運行的版本。LD_PATH_LIBRARY 變量是通過封裝腳本設置的,因此用戶通常甚至不知道它已被設置。

編譯軟件為你在運行系統方面提供了很大的靈活性。LD_LIBRARY_PATH? 變量以及 -L? 和 -l GCC 選項是這種靈活性的組成部分。

責任編輯:趙寧寧 來源: Linux中國
相關推薦

2023-11-29 08:31:20

PythonRust

2011-06-21 18:02:14

Qt 動態 鏈接庫

2009-08-28 16:19:30

C#實現修改動態鏈接庫

2012-05-04 08:24:14

LinuxUnix

2012-05-08 14:48:23

LinuxUnix動態鏈接庫

2024-06-06 08:53:13

動態鏈接庫共享庫

2022-05-03 23:44:21

Python動態鏈接庫Ctypes

2009-07-07 20:57:20

LinuxUnix動態鏈接庫

2024-03-01 20:59:11

C#DLL開發

2009-08-05 16:29:18

C#調用C++動態鏈接

2023-05-09 08:24:11

JNA鏈接庫代碼

2022-05-16 08:17:36

裝飾器模式

2009-10-29 16:36:49

VB.NET .DLL

2011-05-18 17:15:45

2022-10-24 00:03:21

動態鏈接庫DLL

2022-08-29 23:49:41

Python字符串代碼

2022-08-09 07:57:25

Linux操作系統Windows

2022-07-12 13:23:59

靜態鏈接庫可執行文件C 目標文件

2011-08-02 14:15:05

XCode 靜態 鏈接庫

2021-09-01 05:11:13

C# 動態鏈接庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品国产成人 | 国产精品久久久久久久久久久久 | 在线观看视频福利 | 欧美福利一区 | 国内精品久久久久久影视8 最新黄色在线观看 | 日本午夜网 | 午夜激情视频 | 久久精品一区二区三区四区 | 久久精品中文 | 中文字幕精品视频 | 国产精品一区二区三级 | 日韩一区av | 亚洲精品一区中文字幕乱码 | 99精品欧美一区二区三区综合在线 | 7777奇米影视 | 亚洲一区在线免费观看 | 国产超碰人人爽人人做人人爱 | 精品国产高清一区二区三区 | 最新中文在线视频 | 成人精品视频99在线观看免费 | 亚洲日本成人 | 精品一二三区视频 | 91久久看片 | 亚洲不卡在线观看 | 色婷婷一区二区三区四区 | 国产www. | 91精品一区二区三区久久久久久 | 亚洲毛片在线 | 久草网站| 北条麻妃99精品青青久久主播 | 久久精品国产一区二区三区 | 超碰91在线 | av黄色免费在线观看 | 国产在线观 | 69视频在线播放 | 色狠狠一区 | 天天爽天天操 | 免费黄色网址视频 | 91国自产 | 中文字幕在线第一页 | 福利网址|