2011-05-31 91 views
4

我正在爲應用程序編寫插件。應用程序將使用dlopen()加載插件。該平臺是Fedora Linux 11.我擁有應用程序的所有源代碼。如何鏈接通過dlopen插入應用程序的插件()

我已經成功地將我的代碼添加到應用程序中,並且鏈接正常,因爲整個應用程序一次被鏈接。但是,最終我希望我的代碼成爲一個單獨的插件。

我在將代碼構建爲插件時遇到了問題。我將其構建爲共享(.so)庫。我的代碼自然是指應用程序中的符號,所以我需要使用g++-L-l選項指定插件鏈接到的庫。但是,接受我的插件的應用程序是一個可執行文件,而不是一組.so庫。

我在這裏錯過了一些基本點。我如何鏈接我的插件?

請注意,我仍然試圖構建我的插件 - 我還沒有嘗試使用dlopen()加載它。

解答:謝謝大家的回答。我使用了nemo建議的--just-symbols方法,它效果很好。謝謝!

+0

當你試圖鏈接到另一個文件時,我不認爲你需要'-L'和'-l'選項,只是'g ++ -o foo foo.cc bar'。 – sarnold 2011-05-31 20:45:45

+0

你爲什麼使用Fedora 11? – alternative 2011-05-31 20:58:08

回答

2

一種方法是不讓插件直接鏈接到符號。 dlopen()能夠使用NULL路徑將當前進程加載爲「庫」,但這需要在GCC中設置-rdynamic標誌。這就是Glade的工作方式,因爲您將回調函數設置爲XML文件並且它只是「神奇地」起作用。

另一種方法是將一組函數指針傳遞給插件,以便它不必鏈接到它們。這當然需要爲這種事情設計插件架構。

1

我想你想鏈接器的"-R" (aka. "--just-symbols")選項。

所以,如果myexe是主exectuable:

g++ -Wl,--just-symbols=myexe -L... -l... -shared -o plugin.so plugin.o 

附:這假設myexe本身與--export-dynamic連接。否則,您的.so不能引用可執行文件中的符號,因爲它們不會被導出。

1

設計應用程序是否使用插件?如果是這樣,我會認爲它的界面(並且缺乏)是設計不佳的。應用程序應該提供一個庫,像您的插件可以利用,而不必訴諸於鏈接時變通辦法和黑客。