0

Visual Studio 2012 で単純な C スタイル関数のエクスポートとインポートを実行しようとしています。2 つのプロジェクトを作成しました。私の最終的な目標は、Fortran プログラムから C++ 関数を呼び出すことです。そのため、DLL をできるだけ単純なものにしようとしています。最初のプロジェクトには、次のコードを含む 1 つのファイルが含まれているだけです。

#include <stdio.h>

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

これは .dll としてコンパイルされます。次に、次のファイルを含む 2 番目のプロジェクトへのリンク入力にそれを含めます。

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 の間のリンクをよりよく理解しているなら、.dll を fortran とリンクするときに /clr が必要ですか (私はそうではないと思います)?

4

1 に答える 1

1

共有ライブラリは、 Windows では2 つのファイルで構成されます。.dll.lib. _ .libリンカー入力として提供する必要が.dllあり、実行可能ファイルと同じディレクトリまたは%PATH%実行時のどこかに配置する必要があります。

于 2012-10-24T09:32:42.417 に答える