簡體   English   中英

C-共享庫-dlopen,dlsym

[英]C - Shared Library - dlopen, dlsym

對於研究主題,我正在使用C ++程序將SQL查詢轉換為C ++程序。 轉換后,將c ++查詢源代碼編譯到共享庫中:

g++ -O0 -g3 -fPIC -std=c++0x GeneratedQuery.cpp ../type/Types.cpp -shared -o lib.so

一切正常,並且庫正確編譯。 在第二個程序中,我嘗試實現一個read-eval-print-loop,該循環從用戶處獲取查詢,進行翻譯和編譯,使用dlopen和dlsym加載共享庫,最后執行它。 在查詢代碼中使用Intel TBB之前,一切正常,但是現在我輸入的第二個查詢出現了分段錯誤(第一查詢工作正常,但是循環中加載的第二個查詢失敗)。

來源(read-eval-print-loop): http : //pastebin.com/pWkRN7Dx

示例查詢代碼: http//pastebin.com/A1pBZC3d

如果我的查詢中沒有聯接,因此查詢源代碼中出現一個parallel_for,則沒有問題。 但是,如果有多個parallel_fors,則輸入的第二個查詢會出現分段錯誤(編譯成功並且dlopen有效,但dlsym失敗)。

這是gdb的輸出

0x00007ffff7de394b in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de429e in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de4523 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff6cc612a in ?? () from /lib/x86_64-linux-gnu/libc.so.6
0x00007ffff7bd7044 in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7de9176 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7bd752f in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7bd709a in dlsym () from /lib/x86_64-linux-gnu/libdl.so.2
0x000000000041fd58 in main (argc=1, argv=0x7fffffffe1d8) at ../src/tpcc.cpp:141

我真的不明白第二次查詢失敗了。 我為dlopen嘗試了不同的標志,但對任何組合都無效。

希望有人可以幫助我,因為我對共享庫沒有經驗。

問候

嘗試更換

extern "C" { void run { ... } }

extern "C" void run { ... }

請參見精美的http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html文章中的說明。

我不確定我說的話是否正確,但是我記得去年有一個類似的問題,我使用包含的庫解決了生成.so的問題。 像這樣:

g ++ -O0 -g3 -fPIC -std = c ++ 0x GeneratedQuery.cpp ../type/Types.cpp {在此處添加intel內容.a等} -shared -o lib.so

我使用了CMAKE,必須添加到add_library中。

我希望這會有所幫助,即使沒有道歉!

它運行了,但我仍然感到困惑:

如果我給每個庫文件一個其他名稱,如lib..so並加載它,則一切正常。 是否有類似高速緩存的內容可能導致上述行為?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM