亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用.so文件運行c程序

如何使用.so文件運行c程序

Go
慕斯709654 2021-12-07 15:25:21
我已經瀏覽了 StackOverflow 和 Ask Ubuntu 上的所有解決方案。我有一個圍棋程序:package mainimport "C"//export Getintfunc Getint() int {        return  2}func main() {}我已經生成.so了名稱為t.so and header fileth` 的文件現在我想在我的 C 程序中使用這個函數。我已經編寫了代碼,但我不知道如何執行它。#include <stdio.h>#include <t.h>int main(){int a;a=Getint();printf("number : %d",a);return 0;}當我執行它時gcc c.c t.so它生成a.out文件但在運行的時候a.out用./a.out它給出了一個錯誤:./a.outError while loading shared libraries: t.so: can not open shared object file: no such file or directory exists.然后我嘗試:gcc -c c.c -l t.so所以它生成c.o文件并且它是不可執行的。
查看完整描述

3 回答

?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

您應該使用鏈接器選項 -rpath,它告訴鏈接器在可執行程序中添加信息,在哪里可以找到像您的.so文件這樣的運行時庫。

這可以使用 GCC 選項來完成,該選項-Wl指示 GCC 前端程序將選項傳遞給鏈接器:

$ gcc c.c t.so -Wl,-rpath=$(pwd)

這將傳遞-rpath=$(pwd)給鏈接器,并$(pwd)導致 shell 調用pwd命令以返回當前目錄。

只要您不移動庫,程序就應該可以工作。


也可以使用環境變量LD_LIBRARY_PATH,但不推薦使用。


查看完整回答
反對 回復 2021-12-07
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

很可能您的加載程序找不到庫。LD_LIBRARY_PATH在運行二進制文件之前,嘗試將路徑放在 libarry 所在的目錄中。

export LD_LIBRARY_PATH=/path/to/my/library
./a.out


查看完整回答
反對 回復 2021-12-07
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

.so 文件是共享對象,意思是所有需要它們的應用程序都可以使用的對象。也就是說,共享的。由于這種特性,它們需要存放在眾所周知的地方。此外,它們需要由動態鏈接器索引。

例如,在 linux 中,您通常有一個文件/etc/ld.so.conf,其中存儲了自動讀取共享對象的所有目錄

所以你的選擇是:

  • 把你的共享對象文件放在一個眾所周知的地方

  • 將您的共享對象文件放在您選擇的位置,并讓動態鏈接器知道它:在 linux 中,您可以修改ld.so.conf并運行ldconfig以更新 ld 索引

  • 正如其他人建議在環境變量 LD_LIBRARY_PATH 中寫入 .so 的路徑(因為動態鏈接器在運行應用程序之前讀取它)。這必須在每個環境創建時完成

  • 其他建議在編譯時使用 -rpath。請注意,通過這種方式,您無法在編譯后移動 .so 文件

我個人更喜歡在系統庫路徑中安裝 .so 文件


查看完整回答
反對 回復 2021-12-07
  • 3 回答
  • 0 關注
  • 390 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號