我有一个用于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
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
}
}
+0
ioq3ded.ppc64是一个库吗? –
2011-12-28 05:55:17
+2
'dlerror'会给你更多关于错误的信息。而不是'fprintf(fp,“%d”,1);'try'fprintf(fp,“%s”,dlerror());'并检查文件。正如duskwuff在回应中已经提到的那样,'dlopen'不适用于可执行文件。 –
2011-12-28 06:01:23
+0
我试过fprintf(fp,“%s”,dlerror());现在:]收到信号11,正在退出... -----服务器关闭(信号被捕获)----- –
2011-12-28 08:49:30