作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是编程新手,我创建了一个 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/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!