>挑戰:鏈接共享庫
>>我最近在將源構建的庫集成到本地C項目中時遇到了一個鏈接問題。 鏈接器在嘗試鏈接到共享庫時報告了錯誤。 與下面顯示的錯誤消息相似,表明鏈接器找不到庫中定義的符號:undefined reference
<code>/bin/ld: /tmp/ccHb7mJ8.o: in function `SDL_main': main.c:(.text+0x3c): undefined reference to `SDL_EnterAppMainCallbacks' ... (other undefined references) ... collect2: error: ld returned 1 exit status make: *** [Makefile:7: all] Error 1</code>
>故障排除步驟
最初的故障排除涉及使用各種方法多次重新編譯庫,但這一切都沒有成功。 研究使我進入了一個論壇帖子,描述了與32位相關的類似問題與64位工具鏈有關的問題。 雖然我的環境被確認為64位,但這促使我考慮編譯器本身。>
意外的解決方案:切換編譯器> >我從GCC切換到Clang,彙編和鏈接完美地工作。 鑑於解決方案顯然很簡單,並且在過去的項目中缺乏類似問題,這令人驚訝。
一個受控的實驗
為了進一步調查,我創建了一個簡單的測試用例:一個共享庫()實現
>函數,用clang編譯,而驅動程序程序(>
libm.so
add
main.c
> lib.c:
<code class="language-c">#pragma once int add(int a, int b);</code>
main.c:
<code class="language-c">#include "lib.h" int add(int a, int b) { return a + b; }</code>
build_so.sh(clang):
<code class="language-c">#include "lib.h" #include <stdio.h> int main () { printf("4+3=%d\n", add(4, 3)); return 0; }</code>
build_main.sh(gcc):
<code class="language-bash">clang -std=c11 -c -o lib.o lib.c clang -shared -fPIC -o libm.so lib.o</code>
> 結論:編譯器不兼容
<code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
以上是獨特的共享庫問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!