【问题标题】:Making a C DLL in Visual Studio suitable for use by js-ctypes in Mozilla在 Visual Studio 中制作适合 Mozilla 中的 js-ctypes 使用的 C DLL
【发布时间】:2013-11-26 15:49:39
【问题描述】:

正如主题所说,我正在尝试做的与this 类似,但使用的是 Visual Studio 2012。

我可以构建和生成一个 DLL,我可以在 javascript 中加载该 DLL,但我无法访问该 DLL 中的函数。在 DllExp 中查看 DLL 显示没有函数,表明 DLL 有问题。

DLL 是使用“空项目”模板创建的新 C++ 项目。值得注意的设置是;

常规->配置类型设置为 DLL
没有优化。
没有预编译的头文件。
编译为 C 代码
调用约定 __cdecl

编译和链接的命令行,如果有一个我认为不重要的设置,是

 /GS /TC /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /sdl /Fd"Debug\vc110.pdb" /fp:precise /D "_WINDLL" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\StreamInterop.pch" 

对于链接器

 /OUT:"C:\Work\VehicleTracker-DotNet\StreamInterop\Debug\StreamInterop.dll" /MANIFEST /NXCOMPAT /PDB:"C:\Work\VehicleTracker-DotNet\StreamInterop\Debug\StreamInterop.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /IMPLIB:"C:\Work\VehicleTracker-DotNet\StreamInterop\Debug\StreamInterop.lib" /DEBUG /DLL /MACHINE:X86 /INCREMENTAL /PGD:"C:\Work\VehicleTracker-DotNet\StreamInterop\Debug\StreamInterop.pgd" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\StreamInterop.dll.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /TLBI

该项目包含一个 C 源文件 main.c,其中包含

 #include<stdio.h>
 int add(int a,int b)
 {
     return(a+b);
 }

鉴于这就是前面文章中所需要的,在我看来问题一定出在编译器或链接器开关上。谁能看到我错过了什么?

【问题讨论】:

  • 嘿!我在这里有类似的问题:stackoverflow.com/questions/27381478/…。您的 DLL 使用的是 64 位还是 32 位代码?
  • 32 位似乎 - 链接器命令行指定 kernel32.lib 等。请参阅下面的 Mark Tolonen 关于如何实际创建项目的评论——这将很多困难推到了向导中。
  • 谢谢。最后,我自己设法找到了解决方案。如果您有兴趣,它在我提供的上一个链接上。 :)

标签: c visual-studio-2012 dll jsctypes


【解决方案1】:

在使用 Visual Studio 的 Windows 上,要从 DLL 导出函数,请使用:

 #include<stdio.h>
 __declspec(dllexport) int add(int a,int b)
 {
     return(a+b);
 }

附带说明,不要选择 Empty Project,这样 Visual Studio 会为您生成一些示例代码。

【讨论】:

  • 谢谢。这让它工作,虽然不明白为什么以前的海报不需要它。选择空项目,因为唯一特定的 DLL 项目是“MFC DLL”,我担心会产生一些依赖于某些框架的东西,这会阻止它从 js-types 工作。
  • 选择Win32 Project,然后选择DLLExport symbolsgcc 导出所有内容。 VS 需要显式导出。
  • 哦。谢谢,不知道有那个向导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2010-11-02
  • 1970-01-01
  • 2019-10-01
  • 2020-12-06
  • 2021-06-14
  • 1970-01-01
相关资源
最近更新 更多