什麼裝況下lib 的 path 會失效? [論壇 - Ubuntu 程式設計]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊



什麼裝況下lib 的 path 會失效?
會員二級
註冊日期:
2008/5/5 8:18
所屬群組:
已註冊使用者
等級: 5
HP : 0 / 110
MP : 14 / 4018
EXP: 43
離線
請問一下, 我剛剛在編寫程式的時候發生了一個狀況
Makefile的內容如下

gcc -s $(CFLAGS) -m32 -O2 -Wall test.c -I./ -I../../Include -L../../Lib -lAPIs lpthread -o test

編譯後我也確認找得到 .so檔
但我不知道操作了麼system command, 編譯的時候可以過,但執行的時候確給我
cannot open shared object file: No such file or directory

我的目錄位置都沒有改變, 重開了也沒用

請問這是什麼原因?

3/24 14:27:08
應用擴展 工具箱
回覆: 什麼裝況下lib 的 path 會失效?
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 35
HP : 172 / 861
MP : 598 / 21218
EXP: 45
離線
kikiyami 寫到:
請問一下, 我剛剛在編寫程式的時候發生了一個狀況
Makefile的內容如下

gcc -s $(CFLAGS) -m32 -O2 -Wall test.c -I./ -I../../Include -L../../Lib -lAPIs lpthread -o test

編譯後我也確認找得到 .so檔
但我不知道操作了麼system command, 編譯的時候可以過,但執行的時候確給我
cannot open shared object file: No such file or directory

我的目錄位置都沒有改變, 重開了也沒用

請問這是什麼原因?


今天在探索「obconf」原始碼,在找資料的時候,
看到了一篇參考文章「使用 gcc 自製 C/C++ 靜態、共享與動態載入函式庫教學 - G. T. Wang」,

聯想到了您之前在這篇討論所問到的問題,

於是根據您問到的,我自己的推測,模擬重現您遇到的狀況,寫了兩個範例,放在「GitHub」上,提供您做實驗參考。

另外也根據該篇文章,寫了相關的範例,一樣放在「GitHub」上。

猜測您遇到的狀況,可以參考該篇文章其中的主題「共享函式庫」。

其中一個範例「demo_c_build_case_001 / Demo / src

執行


./test



顯示


./test: error while loading shared libraries: libAPIs.so.1: cannot open shared object file: No such file or directory



執行下面指令,就能正常運作了


LD_LIBRARY_PATH=../../Lib ./test



================================================================================

根據該篇文章提到,也可以使用「ldd」來測試

執行


ldd test



顯示


linux-vdso.so.1 (0x00007ffd903c7000)
libAPIs.so.1 => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f851fb4b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f851fd61000)




執行


LD_LIBRARY_PATH=../../Lib ldd test



顯示


linux-vdso.so.1 (0x00007ffd77af2000)
libAPIs.so.1 => ../../Lib/libAPIs.so.1 (0x00007f4ddcc18000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4ddca09000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4ddcc24000)


================================================================================

該篇文章作者還有另一篇「GCC 編譯器基本使用教學與範例 - G. T. Wang」,一併紀錄連結,提供參考。

================================================================================

另外在建立上面提到的「GitHub / demo-build-c-case」專案的時候,

我記起來之前也有建立了兩個專案。

* demo-build-c
* demo-lib-concept

找到之前的一篇討論回覆「#13 回覆: 如何安裝 StarUML-v2.8.0-64-bit.deb ?」,一併紀錄連結,提供參考。

也稍微整理了一下連結

================================================================================

額外一提

根據我在「Xubuntu 20.04」上的測試

執行下面指令


$ dpkg -L libc6-dev | grep pthread



顯示


/usr/include/pthread.h
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h
/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h
/usr/lib/x86_64-linux-gnu/libpthread.a
/usr/share/gdb/auto-load/lib/x86_64-linux-gnu/libpthread-2.31.so-gdb.py
/usr/lib/x86_64-linux-gnu/libpthread.so



注意到「/usr/lib/x86_64-linux-gnu」這個資料夾路徑。

執行「man ldconfig | grep FILES -A 10

顯示


FILES
       /lib/ld.so
              Run-time linker/loader.
       /etc/ld.so.conf
              File containing a list of directories, one per line, in which to search for libraries.
       /etc/ld.so.cache
              File  containing  an  ordered  list  of libraries found in the directories specified in
              /etc/ld.so.conf, as well as those found in the trusted directories.

SEE ALSO
       ldd(1), ld.so(8)





可以找到「/etc/ld.so.conf」這個檔案。

執行下面指令,觀看「/etc/ld.so.conf」這個檔案的內容。


$ cat /etc/ld.so.conf



顯示


include /etc/ld.so.conf.d/*.conf



執行


$ ls /etc/ld.so.conf.d/ -1



顯示


fakeroot-x86_64-linux-gnu.conf
libc.conf
x86_64-linux-gnu.conf
zz_i386-biarch-compat.conf



執行


cat /etc/ld.so.conf.d/x86_64-linux-gnu.conf



顯示


# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu



其中就可以看到「/usr/lib/x86_64-linux-gnu」這個資料夾路徑。

================================================================================

以上提供參考

報告完畢


5/11 22:40:13
應用擴展 工具箱


 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.