Linker 针对静态库编译Fortran程序时未找到函数(在Windows中使用IFORT)

Linker 针对静态库编译Fortran程序时未找到函数(在Windows中使用IFORT),linker,fortran,intel-fortran,Linker,Fortran,Intel Fortran,给定以下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), INTE

给定以下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中)成功编译这个模块,它既是一个共享库,也是一个静态库

此外,我还能够成功编译一个使用共享库的小型Fortran程序(名为
example.f90
)。小程序如下所示:

PROGRAM Example

    USE Test

    INTEGER :: state

    state = process("Hello world!")

END PROGRAM
现在,当我这次尝试使用静态库编译相同的小型Fortran程序时,会出现以下错误:

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

知道如何解决这个问题吗?

当您使用该模块时,例程中的DLLEXPORT进程会变成DLLIMPORT(这是一个添加了一些版本的功能,但我不记得确切的时间)。因此,编译器假设该进程来自DLL,并添加了u imp_u前缀,但是,由于您将库构建为静态库,因此找不到它。您可以1)删除DLLEXPORT,2)使用基于_DLL符号的条件编译(为DLL构建预定义)仅启用DLLEXPORT,然后3)将库构建为DLL

我还将提醒您,链接步骤中库和对象的顺序可能很重要,尽管我认为在这里并不重要。我建议在构建可执行文件时将库放在源代码之后。

Suggestion#2解决了我的用例。谢谢@Steve Lionel!