0

我正在尝试使用 Visual Studios 2012 进行简单的 c 样式函数导出和导入。我做了两个项目。我的最终目标是从 Fortran 程序中调用 c++ 函数,因此我试图使 dll 尽可能简单。第一个项目只包含一个包含以下代码的文件:

#include <stdio.h>

extern "C" __declspec(dllexport) void __cdecl hello()
{
  printf("Hello, World!\n");
}

这被编译为 .dll。然后,我将其包含在到第二个项目的链接输入中,该项目仅包含一个文件:

extern "C" __declspec(dllimport) void __cdecl hello();

int main(int argc, char *argv[])
{
    hello();
    return 0;
}

当我在没有公共语言运行时支持的情况下链接时,我收到错误:

Error   1   error LNK1107: invalid or corrupt file: cannot read at 0x2B8    

如果我使用公共语言运行时支持进行编译,则会收到错误消息:

Error   1   error LNK1302: only support linking safe .netmodules; unable to link 

为了解决互联网希望我使用 /clr:pure 或 /clr:safe 编译的问题,但我的 vs 告诉我这不适用于 c 样式导出。

我的链接命令行调用当前是:

/OUT:"c:\users\kevin\documents\visual studio 2012\Projects\Project1\Release\Project2.exe" /MANIFEST /NXCOMPAT /PDB:"c:\users\kevin\documents\visual studio 2012\Projects\Project1\Release\Project2.pdb" /DYNAMICBASE "c:\users\kevin\documents\visual studio 2012\Projects\Project1\Release\*" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /OPT:REF /SAFESEH /PGD:"c:\users\kevin\documents\visual studio 2012\Projects\Project1\Release\Project2.pgd" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Release\Project2.exe.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1 

提前感谢您的帮助。

另外,如果你们中的任何人更好地理解 fortran 和 c 之间的链接,那么我是否希望 /clr 在使 .dll 与 fortran 链接时(我假设我不这样做)?

4

1 回答 1

1

共享库在 Windows 上由两个文件组成。一个.dll和一个.lib。您必须提供.lib一个作为链接器输入,并且必须将其放在.dll与可执行文件相同的目录中或%PATH%在运行时的某个位置。

于 2012-10-24T09:32:42.417 回答