компиляция с cygwin/gfortran или ifort с acml

Я хотел бы скомпилировать свою программу, связывающуюся с acml. В cygwin (win64) с gfortran, связанным с acml:

$ gfortran empty.f90 -L/c:/cygwin64/acml5.3.1/win64/lib/libacml_dll.lib

урожаи

/tmp/ccKechZN.o:empty.f90:(.text+0xff): undefined reference to `drandinitialize_'
/tmp/ccKechZN.o:empty.f90:(.text+0xff): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `drandinitialize_'
/tmp/ccKechZN.o:empty.f90:(.text+0x13b): undefined reference to `drandgaussian_'
/tmp/ccKechZN.o:empty.f90:(.text+0x13b): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `drandgaussian_'
collect2: error: ld returned 1 exit status

Я попробовал еще несколько вещей с помощью документации, но ничего успешно разрешил компилятору связать с acml. Я также попытался связать библиотеку, добавив -l acml_dll, и получил следующую ошибку:

/usr/lib/gcc/x86_64-pc-cygwin/4.9.3/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lacml_dll
collect2: error: ld returned 1 exit status

Я проверил, что .lib существует в указанном каталоге. Возможно, связанная проблема, я также пытаюсь выполнить вывод из ifort, связанного с acml, на win64. Я использую командную строку «Intel 64 Visual Studio 2013 mode» для компиляции примера программы, которая вызывает подпрограммы из acml (см. документация для связывания в win64):

ifort /libs:dll empty.f90 c:/AMD/acml5.3.1/ifort64_int64/lib/libacml__dll.lib

который дает

Intel(R) Visual Fortran Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 14.0.5.239 Build 20150212
Copyright (C) 1985-2014 Intel Corporation.  All rights reserved.

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

-out:empty.exe
-subsystem:console
empty.obj

По крайней мере, с ifort программа успешно компилируется. Затем, когда я запускаю empty.exe, я получаю следующую ошибку:

Программа не может запуститься, так как на вашем компьютере отсутствует libacml_dll.dll. Попробуйте переустановить программу, чтобы решить эту проблему.

Я попытался переустановить acml 5.3.1, а также попробовать acml 6.1.0, но при выполнении обнаружил ту же ошибку.


person nathrock    schedule 19.02.2016    source источник


Ответы (1)


Простого указания пути к библиотеке недостаточно. Вы также должны сказать компилятору связать библиотеку. Просто добавьте -l acml_dll к параметрам компиляции.

Кроме того, при указании пути к библиотеке с помощью -L предполагается путь, а не файл. Таким образом, полная команда должна выглядеть так

gfortran empty.f90 -L/c:/cygwin64/acml5.3.1/win64/lib/ -lacml_dll

Когда вы запускаете программу, библиотека также должна быть найдена во время выполнения. Самый простой способ добиться этого — использовать rpath:

gfortran empty.f90 -L/c:/cygwin64/acml5.3.1/win64/lib/ -lacml_dll \
                   -Wl,-rpath=/c:/cygwin64/acml5.3.1/win64/lib/
person Alexander Vogt    schedule 19.02.2016
comment
Я попробовал то, что вы предложили, но он не может найти lacml_dll. Я подтвердил, что каталог существует и библиотека находится там. - person nathrock; 20.02.2016