![]() |
1
9
你的主要问题是。在你可以使用你的 helloworld.dll 必须初始化cygwin环境(请参见 http://cygwin.com/faq/faq.programming.html#faq.programming.msvs-mingw )因此,在本机C++中的以下代码将工作:
当然是通往
CygWiN1.DLL
必须找到。您可以将c:\cygwin\bin设置为当前目录,使用
接下来,如果编译dll,最好在编译期间使用def file定义dll的基址,并使导出的所有函数名更清晰可读(请参见 http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gnu-linker/win32.html )
你可以用
更新的 :因为你没有写成功,我认为存在一些问题。在win32/win64 world(非托管世界)中,它起作用。我发布的代码我已经测试过了。在.net中加载cygwin dll可能会有一些问题。在 http://cygwin.com/faq/faq.programming.html\faq.programming.msvs-mingw 一个人可以阅读” 确保堆栈底部有4K的划痕空间 “。在.NET中,此要求可能是错误的。堆栈是线程的一部分,而不是进程。因此您可以尝试在新的.NET线程中使用cygwin dll。自.NET2.0以来,可以定义线程的最大堆栈大小。另一种方法是试图理解 http://cygwin.com/cgi-bin/cvsweb.cgi/~checkout~/src/winsup/cygwin/how-cygtls-works.txt?rev=1.1&content-type=text/plain&cvsroot=src 以及中描述的代码 http://old.nabble.com/Cygwin-dll-from-C--Application-td18616035.html#a18616996 . 但真正有趣的是,我找到了两种不需要任何技巧的方法:
如果你在这方面或在最后选择的另一方面取得了成功,请在你的问题文本中简短地写下。对我来说,独立于名誉和赏金是很有趣的。 |
![]() |
2
2
您应该首先尝试运行简单的hello world示例。在CygWin上,如果你甚至没有得到前一个权限,那么尝试为POSIX编写的一个巨大的遗留C/C++代码库没有多大意义。请注意,如果你在链接cygwin,你必须获得gpl许可你的库。 为此,请查看文档(例如,如果您使用的是cdecl(当前不做的事情),则需要在hello world示例中显式指定): Consuming Unmanaged DLL Functions 在本机端,必须初始化cygwin(请参阅winsup/cygwin/how cygtls works.txt) 直接对库使用p/invoke。用pinvoking进入像loadlibrary这样的win32库来调用库是没有意义的。这只是为错误添加了另一层,却一无所获。 确保您的架构正确无误(网络应用程序在64位计算机上默认运行64位)。因此,请确保您的dll匹配/支持它,或者将.net限制为32位。 如果可以的话,试着让你的另一个图书馆开始工作。(如果您希望使用混合两种完全不同的线程模型的函数,那么您将不得不有一些运气) |
![]() |
3
1
您应该能够引用针对cygwin构建的dll,而无需创建新的dll。唯一的要求是,您需要确保“cygwin.dll”和试图加载的dll都位于适当的路径中。你可能需要使用 SetDllDirectory 在调用“loadlibrary”之前。 |
![]() |
4
1
编写的代码不起作用,导出的函数名由C++编译器修饰,不再类似于“hello”。您通常会声明函数extern“c”来抑制装饰。 但是,你还没走那么远。loadlibrary()调用失败,出现Windows错误998,error\u noaccess,“对内存位置的访问无效”。当其中一个dll中的dllmain()entrypoint依赖于具有accessviolation硬件异常的bombs时,通常会发生这种情况。这应该在调试器(visual studio的输出窗口)中可见,您应该会看到一个异常代码为0xc000005的“首次机会异常”。 这可能会使诊断变得不愉快,您有几个候选dll,它们的调试符号可能与您使用的调试器不匹配。尝试用C编写一个调用loadlibrary的小测试程序来隔离这个问题。将调试器配置为在第一次出现异常时停止。在visual studio中,您可以使用debug+exceptions,thrown复选框来执行此操作。祝你好运! |
![]() |
5
1
标准的ms c编译器支持大多数posix接口,包括pthreads。 有时作为单独的实现,但通常作为宏将posix语法转换为windows库调用。 如果你的c代码没有太多的“gnuism”,你应该能够使用标准的visualc编译器编译它。 |
|
Le Thuan · grep可以只显示我想要的结果吗 6 年前 |
![]() |
Babu · 更新Cygwin后vi或vim未启动 7 年前 |
![]() |
Jay8ee · Cygwin命令替换不工作 7 年前 |
![]() |
CapnKirk · 在cygwin上安装sdkman 7 年前 |