Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c中的简单c风格导出导入_C++_Dllimport_Dllexport - Fatal编程技术网

C++ c中的简单c风格导出导入

C++ c中的简单c风格导出导入,c++,dllimport,dllexport,C++,Dllimport,Dllexport,我正在尝试使用visual Studio 2012进行简单的c风格函数导出和导入。我做了两个项目。我的最终目标是从FORTRAN程序调用C++函数,所以我试图使DLL尽可能简单。第一个项目仅包含一个文件,其代码如下: #include <stdio.h> extern "C" __declspec(dllexport) void __cdecl hello() { printf("Hello, World!\n"); } 当我在没有公共语言运行时支持的情况下链接时,会出现以下

我正在尝试使用visual Studio 2012进行简单的c风格函数导出和导入。我做了两个项目。我的最终目标是从FORTRAN程序调用C++函数,所以我试图使DLL尽可能简单。第一个项目仅包含一个文件,其代码如下:

#include <stdio.h>

extern "C" __declspec(dllexport) void __cdecl hello()
{
  printf("Hello, World!\n");
}
当我在没有公共语言运行时支持的情况下链接时,会出现以下错误:

Error   1   error LNK1107: invalid or corrupt file: cannot read at 0x2B8    
Error   1   error LNK1302: only support linking safe .netmodules; unable to link 
如果使用公共语言运行时支持进行编译,则会出现以下错误:

Error   1   error LNK1107: invalid or corrupt file: cannot read at 0x2B8    
Error   1   error LNK1302: only support linking safe .netmodules; unable to link 
为了解决这个问题,internet希望我使用/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之间的链接,那么我在使.dll与fortran链接时是否需要/clr(我假设不需要)?

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

我认为您不应该直接链接dll,而是创建一个导入库,使用与dll相同的名称,但使用.lib并使用该名称链接。是否使用dll或lib链接?
“c:\users\kevin\documents\visualstudio 2012\Projects\Project1\Release\*”
在命令行中没有任何意义
*
是所有文件,链接器会吐出几个文件(如果它像在Windows中那样展开
*
,则每个应用程序都必须自己展开,但如果没有展开,则文件不存在)。我试图让它生成以下内容。现在它生成了.lib文件,但仍然给出了相同的错误。我还尝试将第一个项目重新创建为win32 dll项目,但这也没有改变任何内容。@user1745815:您修复了链接器生成最终可执行文件的调用了吗?生成.lib文件是一回事,但您也必须使用它。我做了与添加原始.dll相同的事情,即添加为链接器输入中的附加依赖项。@user1745815:检查生成的命令行(每个工具设置中都有命令行选项卡),如果不确定,请将命令行添加到问题中。