我有一個用於Windows的書面代碼,現在我試圖移植到Linux,但不知道它是否可行。如何回調exe中的函數? (linux)
我的問題:我試圖從共享庫中的可執行文件中回調函數。我怎麼做?
我對Linux很新,所以如果我的問題太低級,請和我一起袒護。
這是編譯輸出:
Output:
build/release-linux-ppc64/ioq3ded.ppc64
build/release-linux-ppc64/ioquake3.ppc64
build/release-linux-ppc64/baseq3/cgameppc64.so
build/release-linux-ppc64/baseq3/qagameppc64.so
build/release-linux-ppc64/baseq3/uippc64.so
build/release-linux-ppc64/missionpack/cgameppc64.so
build/release-linux-ppc64/missionpack/qagameppc64.so
build/release-linux-ppc64/missionpack/uippc64.so
make[2]: Entering directory `/r/home7/XXX/ioquake3'
make[2]: `build/release-linux-ppc64/ioq3ded.ppc64' is up to date.
make[2]: `build/release-linux-ppc64/ioquake3.ppc64' is up to date.
LD build/release-linux-ppc64/baseq3/cgameppc64.so
LD build/release-linux-ppc64/baseq3/qagameppc64.so
LD build/release-linux-ppc64/baseq3/uippc64.so
LD build/release-linux-ppc64/missionpack/cgameppc64.so
LD build/release-linux-ppc64/missionpack/qagameppc64.so
LD build/release-linux-ppc64/missionpack/uippc64.so
這是我跑來執行我的程序的命令,這就是爲什麼我想通「ioq3ded.ppc64」是我的可執行文件。
./ioq3ded.ppc64 +set fs_game Mod +set sv_pure 0 +set vm_game 0 +set vm_cgame 0 +set vm_ui 0 +set dedicated 1 +exec something_117.cfg
這是代碼爲Windows:
//Called function
__declspec(dllexport) void UnLinkLinkroutingcache(void)
{
//code
}
//Callback location
#include<windows.h>
typedef void (* fUnLinkLinkroutingcache_t)(void);
void fUnLinkLinkroutingcache(fUnLinkLinkroutingcache_t pUnLinkLinkroutingcache)
{
pUnLinkLinkroutingcache(); return;
}
fUnLinkLinkroutingcache_t pUnLinkLinkroutingcache;
void callUnlinkLink(void)
{
HMODULE hLib;
//fUnLinkLinkroutingcache_t pUnLinkLinkroutingcache;
hLib = LoadLibrary(TEXT("ioquake3.exe"));
if (hLib == NULL)
{
//Module not found, permission denied, ...
return 0; //inform caller of error
}
pUnLinkLinkroutingcache = (fUnLinkLinkroutingcache_t)GetProcAddress(hLib, TEXT("UnLinkLinkroutingcache"));
if (pUnLinkLinkroutingcache == NULL)
{
return 0;
}
fUnLinkLinkroutingcache(pUnLinkLinkroutingcache);
}
我試圖端口的代碼到Linux,但我似乎無法加載exe文件。
//Called function
extern void UnLinkLinkroutingcache(void)
//Callback location
void callUnlinkLink(void)
{
void* handle;
void (*initializer)(void);
FILE *fp;//zgzg2020
fp = fopen("HereIsMe.txt", "a");
if(fp != NULL)
{
fprintf(fp, "%d", 1);
fprintf(fp, "\n");
}
fclose(fp);
handle = dlopen("./ioq3ded.ppc64", RTLD_LAZY);
if(handle == NULL) {
// report error ...
fp = fopen("ICantFindFile.txt", "a");
if(fp != NULL)
{
fprintf(fp, "%d", 1);
fprintf(fp, "\n");
}
fclose(fp);
exit(1);return;
} else {
initializer = dlsym(handle,"UnLinkLinkroutingcache");
if(initializer == NULL) {
// report error ...
fp = fopen("ICantFindFfunction.txt", "a");
if(fp != NULL)
{
fprintf(fp, "%d", 1);
fprintf(fp, "\n");
}
fclose(fp);
exit(1);return;
} else {
// cast initializer to its proper type and use
(*initializer)();
}
// use the result in a call to dlsym
}
}
ioq3ded.ppc64是一個庫嗎? – dicaprio 2011-12-28 05:55:17
'dlerror'會給你更多關於錯誤的信息。而不是'fprintf(fp,「%d」,1);'try'fprintf(fp,「%s」,dlerror());'並檢查文件。正如duskwuff在迴應中已經提到的那樣,'dlopen'不適用於可執行文件。 – 2011-12-28 06:01:23
我試過fprintf(fp,「%s」,dlerror());現在:]收到信號11,正在退出... -----服務器關閉(信號被捕獲)----- – user598208 2011-12-28 08:49:30