Я пытаюсь сделать простую функцию экспорта и импорта в стиле c в Visual Studio 2012. Я сделал два проекта. Моя конечная цель — вызвать функции c ++ из программы на Фортране, поэтому я пытаюсь сделать dll максимально простым. Первый проект просто содержит 1 файл, который имеет этот код:
#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 (я предполагаю, что нет)?
Общая библиотека состоит из два файлы на винде. .dll
и .lib
, Вы должны предоставить .lib
один в качестве входного линкера, и вы должны поставить .dll
в том же каталоге, что и исполняемый файл или где-то в %PATH%
во время выполнения.
Других решений пока нет …