Несоответствие имени при использовании общей библиотеки Fortran - PullRequest
0 голосов
/ 03 октября 2018

Мне удалось успешно скомпилировать общую библиотеку, используя IFORT, который содержит некоторые файлы .obj (т.е. зависимости), скомпилированные Visual Studio C.

При попытке использовать эту общую библиотеку в программе на Фортране она не сообщает Example.obj : error LNK2019: unresolved external symbol TEST_mp_EXECUTE referenced in function MAIN__.

Когда я использую инструмент dumpbin.exe, я вижу, что функция execute находится в общей библиотеке.Есть идеи, почему это несоответствие имен приводит к сбою компиляции программы на Фортране?

Содержимое файла Test.c:

__declspec(dllexport) int execute(void);

int execute(void)
{
    return 2 + 3;
}

Файл Test.c успешно скомпилировано с Microsoft VisualStudio C выглядит следующим образом (в результате получается объектный файл с именем Test.obj):

cl.exe Test.c /FoTest.obj

Содержимое файла Test.f90:

MODULE Test

    USE, INTRINSIC :: iso_c_binding, ONLY: c_int
    IMPLICIT NONE

    INTERFACE

        INTEGER(c_int) FUNCTION execute() BIND(C, name = "execute")
            USE, INTRINSIC :: iso_c_binding, ONLY: c_int
        END FUNCTION

    END INTERFACE

END MODULE

Файл Test.f90, успешно скомпилированный с IFORTследующим образом (в результате получается общая библиотека с именем Test_dll.dll вместе с заголовочным файлом с именем Test_dll.lib и файлом модуля Fortran с именем test.mod):

ifort.exe Test.obj /Qm64 /LD /FeTest_dll.dll

Содержимое файла Example.f90:

PROGRAM Example

    USE test

    state = execute()

END PROGRAM

Теперь при попытке скомпилировать файл Example.f90 как ifort.exe Example.f90 Test_dll.lib он не может сказать Example.obj : error LNK2019: unresolved external symbol TEST_mp_EXECUTE referenced in function MAIN__.Есть идеи, что происходит?

1 Ответ

0 голосов
/ 03 октября 2018

Обратите внимание, что у вас есть два источника, которые компилируются в test.obj - Fortran и C. Кроме того, команда cl, которую вы показали, пытается сгенерировать исполняемый файл.Вот как это сделать правильно:

cl /c /MD /Foctest.obj test.c
ifort /dll test.f90 ctest.obj
ifort example.f90 test.lib

Я добавил / MD к компиляции C, чтобы получить совместимый набор библиотек времени выполнения.Это сгенерировало исполняемый файл без ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...