我在將 .so 檔案鏈接到我的 main1.c 時遇到問題
起初,我使用下面的命令從多個 c 源檔案和頭檔案創建 .so 檔案。
arm-linux-gnueabi-gcc -shared -o ~/Docs/examples/libmylib1.so -fPIC *.c -lpthread -ldl -lm
然后我在同一個檔案夾(~/Docs/examples)中創建了 main1.c 檔案,并使用以下命令為使用 libmylib1.so 的 main1.c 生成另一個 .so 檔案
arm-linux-gnueabi-gcc -shared -o libmain2.so main1.c -L ~/Docs/examples -lmylib1 -lpthread -ldl -lm
當我將 libmylib1.so 檔案復制到另一個檔案夾并嘗試將其與另一個 code.c 檔案一起使用時,它不起作用。新檔案夾僅包含 libmylib1.so 和 code.c。這是我使用的命令。
arm-linux-gnueabi-gcc -shared -o libcode1.so code.c -L ~/Docs/newlocation -lmylib1 -lpthread -ldl -lm
但是當我添加 {-idirafter ~/Docs/examples} 并包含 libmylib1.so 的原始位置時,它似乎可以作業。
以下是我的一些嘗試:
**abc@abc-TULPAR-T5-V21-4:~/Docs/newlocation$** ls
code.c libmylib1.so
**abc@abc-TULPAR-T5-V21-4:~/Docs/newlocation$** arm-linux-gnueabi-gcc -shared -o libcode1.so code.c -L ~/Docs/newlocation -lmylib1 -lpthread -ldl -lm
code.c:1:10:致命錯誤:comm_genlib.h:沒有這樣的檔案或目錄
1 | #include “comm_genlib.h”
| ^~~~~~~~~~~~~~~
編譯終止。
**abc@abc-TULPAR-T5-V21-4:~/Docs/newlocation$** arm-linux-gnueabi-gcc -shared -o libcode1.so code.c -L ~/Docs/newlocation -idirafter ~/檔案/示例 -lmylib1 -lpthread -ldl -lm
**abc@abc-TULPAR-T5-V21-4:~/Docs/newlocation$** ls
code.c libcode1.so libmylib1.so
我不知道為什么當我添加 -idirafter ~/Docs/examples 時它會起作用
如何解決這個問題?
uj5u.com熱心網友回復:
編譯程序中有兩個重要階段:將源代碼轉換為原始二進制檔案,以及打包形成可執行檔案或共享庫所需的所有原始二進制檔案。
對于第一階段,編譯器必須能夠訪問所有源檔案:命令列中參考的“.c”以及這些“.c”中通過#include指令參考的所有其他源檔案。
為了找到這些源代碼,編譯器會在一些特定于編譯器的目錄中查找,例如/usr/include; 它還搜索當前目錄。
但該~Docs/examples目錄不是默認搜索目錄的一部分。comm_genlib.h因此無法決議對的參考并且編譯崩潰。
該-idirafter選項將此目錄添加到搜索路徑。這就是添加時編譯作業的原因。
在第一階段,.so不使用二進制檔案,如檔案。它們將處于編譯的第二階段。無論如何,.h檔案不包含在二進制檔案中;在第一階段僅用作純文本檔案。
您遇到的問題沒有特別的解決方案,因為最終這不是問題,而是“C”編譯器的作業方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/533003.html
