藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


C或C++能實現嗎?

C或C++能實現像java中class.forname(classname);
也就是傳入一個類名(C++)或函數名(C中),能否動態的從文件系統中加載這個類或方法?


我想了想好像是不行的。

C或C++能實現嗎?

mfc就實現了你說的這種功能。

C或C++能實現嗎?

從文件系統?
不明白你說的是什麼
詳細點呢

C或C++能實現嗎?

C或C++能實現嗎?

簡單的說,Java能實現的,C++都能實現,並且運行效率要高很多,這一點不用懷疑,但是反過來,C++能實現的,Java就不一定能實現。

C或C++能實現嗎?

我的理解是他想用c++實現一個類似於java中class類。

C或C++能實現嗎?

我也想實現類似JAVA的Reflection功能,還沒找到C++動態加載的方法,C裡面的動態庫倒是有資料

C或C++能實現嗎?

要實現的功能:
有文件格式A,B,C
相對應該的PA,PB,PC三個類或三個函數來對三種不同的文件格式轉換成另一格式。

type為傳入要處理的文件格式相應該的處理類名
int process(String type,String filename)
{
     /*
         這邊根據type的值動態實例一個類
        java 中:obj = class.forName(type);這樣就創建設了一個類的實例
    */
     /*
      每個類定義一相同方法進行處理。
    */
     obj.process(filename);
}

這樣子的話如果我加一個文件類型D,那麼我只要實現一個PD的類,然後傳值的時候傳入這個類名,只需要編譯這個類,而不需要改原來的任何代碼。實現開閉原則。

C或C++中如何實現

不知道我描述的對不對。
熟悉java的朋友應該知道。



我之所以認為比較難實現。因為java是虛擬機的形式,比較容易實現,我現在的實現方法是自己寫一個比較簡單的編譯器,寫自己的腳本,然後進行處理,不過不大好用。

to:joint   
哪有相關資料

to:bigluo   
可惜我要在linux,unix實現

C或C++能實現嗎?

C的資料在精華里有,動態庫的內容,無雙發的貼子

C或C++能實現嗎?

-->     

看看候傑的深入遷出mfc吧,裡面用大量的篇幅介紹了mfc如何實現動態創建。這部分代碼可以很容易的porting到你的design中!!

C或C++能實現嗎?

http://www.chinalinuxpub.com/doc/howto/GCC-HOWTO-7.html

7. 動態載入
這一章節目前是簡短了一點;當我掠盡ELF HOWTO時,就是這部份再度擴展的時候了。


7.1 基本概念
Linux有共享程序庫,如果之前你已坐著讀完上一章節,想必現在一聽到像這樣的說詞,便會立刻感到頭昏。有一些照慣例而言是在連結時期便該完成的工作,必須延遲到載入時期才能完成。

7.2 錯誤訊息
把你連結的錯誤寄給我!我不會做任何的事,不過我可以把它們寫起來**



can't load library: /lib/libxxx.so, Incompatible version
(a. out only) 這是指你沒有xxx程序庫的正確的主要版本。可別以為隨隨便便弄個連結到你目前擁有的版本就可以了,如果幸運的話,就只會造成你的程序分頁錯誤而已。去抓新的版本.ELF類似的情況會造成像下面這樣的訊息:


ftp: can't load library 'libreadline.so.2'


warning using incompatible library version xxx
(a. out only)你的程序庫的次要版本比起這支程序用來編譯的還要舊。程序依然可以執行。只是可能啦!我想,升個級應該沒什麼傷害吧!



7.3 控制動態載入器的運作
有一組環境變量會讓動態載入器有所反應。大部份的環境變量對ldd的用途要比起對一般users的還要來得更多。而且可以很方便的設定成由ldd配合各種參數來執行。這些變量包括,


LD_BIND_NOW --- 正常來講,函數在調用之前是不會讓程序尋找的。設定這個旗號會使得程序庫一載入,所有的尋找便會發生,同時也造成起始的時間較慢。當你想測試程序,確定所有的連結都沒有問題時,這項旗號就變得很有用。
LD_PRELOAD可以設定一個文件,使其具有*覆蓋*函數定義的能力。例如,如果你要測試內存分配的方略,而且還想置換*malloc*,那麼你可以寫好準備替換的副程序,並把它編譯成mallolc.,然後:
$ LD_PRELOAD=malloc.o; export LD_PRELOAD
$ some_test_program

LD_ELF_PRELOAD 與 LD_AOUT_PRELOAD 很類似,但是僅適用於正確的二進位格式。如果設定了 LD_something_PRELOAD 與 LD_PRELOAD ,比較明確的那一個會被用到。
LD_LIBRARY_PATH是一連串以分號隔離的目錄域名,用來搜尋共享程序庫。對ld而言,並沒有任何的影響;這項只有在執行期間才有影響。另外,對執行setuid與setgid的程序而言,這一項是無效的。而LD_ELF_LIBRARY_PATH與LD_AOUT_LIBRARY_PATH這兩種旗號可根據各別的二進位型式分別導向不同的搜尋路徑。一般正常的運作下,不應該會用到LD_LIBRARY_PATH;把需要搜尋的目錄加到/etc/ld.so.conf/裡;然後重新執行ldconfig。
LD_NOWARN 僅適用於a.out。一旦設定了這一項(LD_NOWARN=true; export LD_NOWARN),它會告訴載入器必須處理fatal-warnings(像是次要版本不兼容等)的警告訊息。
LD_WARN僅適用於ELF。設定這一項時,它會將通常是致命訊息的「Can*t find library」轉換成警告訊息。對正常的操作而言,這並沒有多大的用處,可是對ldd就很重要了。
LD_TRACE_LOADED_OBJECTS僅適用於ELF。而且會使得程序以為它們是由ldd所執行的:
$ LD_TRACE_LOADED_OBJECTS=true /usr/bin/lynx
        libncurses.so.1 =>; /usr/lib/libncurses.so.1.9.6
        libc.so.5 =>; /lib/libc.so.5.2.18


7.4 以動態載入撰寫程序
如果你很熟悉Solaris 2.x所支持的動態載入的工作的話,你會發現Linux在這點上與其非常的相近。這一部份在H.J.Lu的ELF程序設計文件內與dlopen(3)的manual page(可以在ld.so的套件上找到)上有廣泛的討論。這裡有個不錯的簡單範例:以-ldl連結。

#include <dlfcn.h>;
#include <stdio.h>;

main()
{
  void *libc;
  void (*printf_call)();

  if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))
  {
    printf_call=dlsym(libc,"printf");
    (*printf_call)("hello, world\n");
  }

}



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com