gpt4 book ai didi

c - 如何在运行时将 dll 链接到 exe 文件?

转载 作者:行者123 更新时间:2023-11-30 17:30:55 24 4
gpt4 key购买 nike

我是编程新手,我创建了一个 dll 项目,在其中我将只打印一行。在应用程序项目中,我调用了 dll 项目中定义的函数。

我的问题是,在构建 dll 项目后不久,我就得到了 dll 文件。但是当我构建主应用程序(即应用程序项目)时,我收到以下错误。

--------------------Configuration: test_bench - Win32 Debug-------------------- 
Compiling...
main.c
Linking...
main.obj : error LNK2001: unresolved external symbol _print_dll
../../exec/test_bench.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

test_bench.exe - 2 error(s), 0 warning(s)

如果我在构建之前链接 obj,它就会被构建。但是,如果我更改 dll 项目的代码,我必须再次重新构建主项目,这在运行 dll 时是不必要的。

请帮助我实现这一目标

最佳答案

我编写了一个小二进制模板来帮助进行与 dlopen 相关的调用。您需要根据您的特定用例调整它(事实上,它只处理字符串),但我发现它在很多情况下都很方便。

用法:dlopener/path/to/library.extension function_name [args...]

//gcc -rdynamic -o dlopener dlopener.c -ldl
#include <dlfcn.h> /*for dlopen,dlsym,dlclose*/

int main(int argc, char **argv){

/* get a "handle" for a shared library*/
void *handle = dlopen(argv[1], RTLD_LAZY);

/* make sure we got a handle before continuing*/
if (! handle) return 1;

/*undefined, but workable solution : POSIX.1-2003 (Technical Corrigendum 1) */
void* (*f)()=dlsym(handle, argv[2]);

/*now call the function f(argv[3],argv[4],...argv[argc]); */
//TODO convert args to unsigned char representations for other types
while (argc > 2) /*ugh, have to use asm to preserve stack*/
asm("push %0"::"r"(argv[argc--])); /*from right to left*/

asm("call *%0"::"r"(f)); //TODO "=a"(ret) where is uchar[XXX]

/*remember that shared library we opened?*/
dlclose(handle);

return 0;
}

注意:对于某些WIN32函数(cdecl调用约定IIRC),您需要使用与push不同的asm机制来获取寄存器中而不是堆栈中的值

关于c - 如何在运行时将 dll 链接到 exe 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com