Функция не найдена при компиляции программы на Фортране со статической библиотекой (в Windows с использованием IFORT) - PullRequest
3 голосов
/ 23 марта 2019

Учитывая следующий модуль Fortran:

MODULE Test

    IMPLICIT NONE

    INTERFACE

        INTEGER(c_int) FUNCTION process_(script, script_size) BIND(C, name = "process")
            USE, INTRINSIC :: iso_c_binding, ONLY: c_int, c_char
            CHARACTER(c_char), INTENT(IN) :: script(*)
            INTEGER(c_int), INTENT(IN), VALUE :: script_size
        END FUNCTION

    END INTERFACE

    CONTAINS

        FUNCTION process(script)
            #ifdef SHARED_LIB
                !DEC$ ATTRIBUTES DLLEXPORT :: process
            #endif
            INTEGER :: process
            CHARACTER(LEN = *), INTENT(IN) :: script

            process = process_(script, LEN(script))
        END FUNCTION

END MODULE

Я могу успешно скомпилировать этот модуль, используя IFORT (в Windows), как в виде общей библиотеки, так и статической библиотеки.

ДополнительноЯ могу успешно скомпилировать небольшую программу на Фортране (с именем example.f90), которая использует общую библиотеку.Небольшая программа выглядит следующим образом:

PROGRAM Example

    USE Test

    INTEGER :: state

    state = process("Hello world!")

END PROGRAM

Теперь, когда я пытаюсь скомпилировать ту же самую маленькую программу на Фортране на этот раз с использованием статической библиотеки, она выдает следующую ошибку:

C:\workspace\>ifort.exe /Qopenmp /module:library library\Test.lib example.f90

Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 16.0 Build 20160811
Copyright (C) 1985-2016 Intel Corporation.  All rights reserved.

Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

-out:example.exe
-subsystem:console
-defaultlib:libiomp5md.lib
-nodefaultlib:vcomp.lib
-nodefaultlib:vcompd.lib
library\Test.lib
example.obj
example.obj : error LNK2019: unresolved external symbol __imp_TEST_mp_process referenced in function MAIN__
example.exe : fatal error LNK1120: 1 unresolved externals

Любойидея как это решить?

1 Ответ

3 голосов
/ 23 марта 2019

DLLEXPORT в рутинном процессе превращается в DLLIMPORT, когда вы ИСПОЛЬЗУЕТЕ модуль (эта функция добавила некоторые версии назад, но я точно не помню, когда.) Компилятор поэтому предполагает, что процесс происходит из DLL и добавляет префикс __imp_, но поскольку вы создали библиотеку как статическую библиотеку, она не найдена. Вы можете 1) удалить DLLEXPORT, 2) использовать условную компиляцию на основе символа _DLL (предопределена для сборок DLL), чтобы только затем включить DLLEXPORT, 3) построить библиотеку как DLL.

Я также предупреждаю вас, что порядок библиотек и объектов на этапе связывания может иметь значение, хотя я не думаю, что это имеет значение здесь. Я бы рекомендовал размещать библиотеки после исходных текстов при сборке исполняемого файла.

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