Здравствуйте Nondefine, Вы писали:
N>Есть такая проблема. В фортрановском файлике определена функция: N>INTEGER*4 function my()
... N>Потом ее нужно вызвать из сишного: N>extern int __stdcall my();
N>В результате при линковке всего этого дела в VC 6.0 с встроенным Compac Visual Fortran 6.1 получаю unresolved external _my.
N>Как с этим бороться?
Ответа я не знаю. Сразу говорю. Но можно попытаться.
Возможно, дело в декорировании имен. Либо в несоответствии соглашений о вызовах. В первом случае ни в одном из прилинкованных obj-файлов не будет найдена функция, требуемая С-шным компилятором. (можно поискать любым текстовым редактором соответствие)
Можно попытаться посмотреть (в map-файле), во что преобразуется имя my. Возможно, поможет вставка "C" между extern и int:
extern"C"int __stdcall my();
Возможно, что и не поможет. Если точно не известно, что фортранные функции имеют соглашение о вызовах __stdcall, то можно попробовать __cdecl.
Здравствуйте Kaa, Вы писали:
Kaa>Здравствуйте Nondefine, Вы писали:
N>>Есть такая проблема. В фортрановском файлике определена функция: N>>INTEGER*4 function my() Kaa>... N>>Потом ее нужно вызвать из сишного: N>>extern int __stdcall my();
N>>В результате при линковке всего этого дела в VC 6.0 с встроенным Compac Visual Fortran 6.1 получаю unresolved external _my.
N>>Как с этим бороться? Kaa>Ответа я не знаю. Сразу говорю. Но можно попытаться.
Kaa>Возможно, дело в декорировании имен. Либо в несоответствии соглашений о вызовах. В первом случае ни в одном из прилинкованных obj-файлов не будет найдена функция, требуемая С-шным компилятором. (можно поискать любым текстовым редактором соответствие)
Kaa>Можно попытаться посмотреть (в map-файле), во что преобразуется имя my. Возможно, поможет вставка "C" между extern и int: Kaa>
Kaa>extern"C"int __stdcall my();
Kaa>
Kaa>Возможно, что и не поможет. Если точно не известно, что фортранные функции имеют соглашение о вызовах __stdcall, то можно попробовать __cdecl.
Известно точно (описано в MSDN), что фортрановские функции, вызываемые из С, должны декларироваться с __stdcall. Но как ни странно и мсдеэновский сампл тоже не линкуется.
Здравствуйте Nondefine, Вы писали:
N>Известно точно (описано в MSDN), что фортрановские функции, вызываемые из С, должны декларироваться с __stdcall. Но как ни странно и мсдеэновский сампл тоже не линкуется.
Дело в том что ко всем именам сишных функций компилятор неявно добавляет
спереди подчеркивание. Вот на это ты и наступил.
Попробуй в Фортране обьявить эту функцию как _my (если это возможно).
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Здравствуйте Nondefine, Вы писали:
N>Есть такая проблема. В фортрановском файлике определена функция: N>///////////////////////// N>INTEGER*4 function my()
N>INTEGER*4 i1
N>i1=i1+1 N>my=i1 N>return N>end N>//////////////////////// N>Потом ее нужно вызвать из сишного: N>...
N>extern int __stdcall my();
N>void main() N>{ N>integer i;
N>i = my();
N>}
N>В результате при линковке всего этого дела в VC 6.0 с встроенным Compac Visual Fortran 6.1 получаю unresolved external _my.
N>Как с этим бороться?
Чтобы сделать функцию stdcall, попробуй определить её так: