首頁 > 後端開發 > C++ > 獨特的共享庫問題

獨特的共享庫問題

Patricia Arquette
發布: 2025-01-28 14:03:11
原創
365 人瀏覽過

Unique Shared Library Problem

>挑戰:鏈接共享庫

>

>我最近在將源構建的庫集成到本地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.h:
  • > 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>
    登入後複製
  • 這導致與我的原始項目相同的錯誤。 但是,當修改
  • 腳本以使用clang時,問題就解決了。 進一步的實驗逆轉了編譯器角色(圖書館的GCC,主要程序的clang),並且該組合正常工作。

    > 結論:編譯器不兼容

    <code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
    登入後複製
  • >調查顯示出明顯的不兼容性:與GCC相關時,張別的共享庫似乎存在問題,而反向情景無問題。這可能解釋了為什麼我以前沒有遇到這個問題,因為我通常在項目的所有部分中使用相同的編譯器。 這種不兼容的根本原因尚不清楚,但是當整合使用不同編譯器構建的庫時,它突出了潛在的陷阱。 如果有人知道解決方法,我會非常有興趣聽到。
>

以上是獨特的共享庫問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板