2016-12-02 70 views
3

我一直在努力與dlopen未定義的符號C:處理共享對象中的未定義符號

我已經和到目前爲止已經試過:與功能functionA()

libraryB.so這是使用functionA()

libraryA.a與功能functionA()

libraryA.so

執行能夠加載libraryB.so與dlopen。

我得到的是:

undefined symbol: functionA 

如何我構建:

LibraryA的:

gcc -std=gnu11 -O2 -g -Wall -Wstack-usage=2000 -Werror 
-fdiagnostics-color -fPIC -pipe -fsigned-char -fno-asynchronous-unwind-tables  
-fno-stack-protector -I../include/ libraryA.c -shared -o libraryA.so 

libraryB:

gcc -std=gnu11 -O2 -g -Wall -Wstack-usage=2000 -Werror -fdiagnostics-color 
-fPIC -pipe -fsigned-char -fno-asynchronous-unwind-tables 
-fno-stack-protector -I../include/ libraryB.c -shared -o libraryB.so 

建立可執行的:

-std=gnu99 -pipe -fno-strict-aliasing -fsigned-char -fno-asynchronous-unwind-tables 
-fno-stack-protector -Wall -Wextra -Wundef -Wno-sign-compare -Wno-unused-parameter 
-Wno-packed-bitfield-compat -Wno-misleading-indentation -fomit-frame-pointer 
-maccumulate-outgoing-args -fPIC -m64 -g3 -gdwarf-2 -fno-common -Wstrict-prototypes 
-Wimplicit -Wno-pointer-sign -c executable.c -o executable libraryA.a 

打開libraryB在執行這樣的位置:

void *handle = dlopen("libraryB.so", RTLD_LAZY); 

if (handle == NULL) { 
    fprintf(stderr, "Load error (%s)!\n", dlerror()); 
    return NULL; 
} 

我怎樣才能解決這個問題?我也嘗試過國旗-rdynamic沒有成功。我也嘗試了不同的dlopen標誌,但也沒有成功。

任何人都可以幫我嗎?

回答

1

您需要鏈接libraryB.solibraryA.so因爲libraryB.so使用libraryA.so的符號。

只需添加libraryA.solibraryB.so的鏈接命令。

具體情況取決於庫安裝您可能還需要使用-rpath標誌。

此外,由於libraryB.so依賴於libraryA.so,因此您的Makefile規則應明確指定此依賴關係。

+0

這也是我用** - L **和** - l **選項嘗試過的,但是我仍然有** libraryB中的未定義符號** – Elec

+0

不,只是明確列出'libraryB.so'鏈接命令。 –

+0

尚未解決。 'gcc -std = gnu11 -O2 -g -Wall -Wstack-usage = 2000 -Werror -fdiagnostics-color -fPIC -pipe -fsigned-char -fno-asynchronous-unwind-tables -fno-stack-protector -I ../ include/libraryA.so libraryB.c -shared -o libraryB.so' – Elec

-1

解決方案

gcc -std=gnu11 -O2 -g -Wall -Wstack-usage=2000 -Werror -fdiagnostics-color -fPIC -pipe -fsigned-char -fno-asynchronous-unwind-tables -fno-stack-protector -I../include/ libraryB.c libraryA_static.a -shared -o libraryB.so 

我建立我libraryB與A的靜態庫,之後一切都很好,我可以使用所有的符號和功能。

非常感謝大家!

+0

儘管如此,您現在已經將B *靜態鏈接到了答:您應該能夠將B *動態鏈接到A,以便它們可以獨立更新。像'gcc -shared -o libraryB.so libraryB.c -lraryA'。如果你想確保滿足B的所有要求,可以加上'-Wl, - no-undefined'。 –

0

當你建立圖書館B,你需要將其對圖書館的鏈接:

gcc -shared -o libraryB.so libraryB.c -lraryA 

您可能需要添加合適的-L選項,如果libraryA.so是不是已經在你的搜索路徑。

如果圖書館B的目的是爲完整,沒有未定義的符號,將選項-Wl,--no-undefined添加到您的鏈接線。這樣,任何缺失的依賴關係都會在鏈接時報告,而不是等到運行時。

否則,您仍然可以使用ldd檢查libarryB.so以查看它引用的庫。