Dear all.
I am working on getting NLOpt to work on Intel Fortran for Windows using the
precompiled DLL. Any help or prior experience regarding this would be highly
appreciated. Please see the description of the problem below.
The ifort compiler requires a .lib file as a link to the DLL file, and I have
created it from the provided .def file using the lib command from the Microsoft
Library Manager (alt. dlltool from MinGW):
1. lib /def:libnlopt-0.def
Checking the .lib file using dumpbin gives reasonable results:
2. dumpbin -exports libnlopt-0.lib
(snip)
Dump of file libnlopt-0.lib
File Type: LIBRARY
Exports
ordinal name
_nlo_add_equality_constraint
_nlo_add_equality_constraint_
_nlo_add_equality_constraint__
_nlo_add_equality_mconstraint
_nlo_add_equality_mconstraint_
_nlo_add_equality_mconstraint__
_nlo_add_inequality_constraint
_nlo_add_inequality_constraint_
_nlo_add_inequality_constraint__
_nlo_add_inequality_mconstraint
_nlo_add_inequality_mconstraint_
_nlo_add_inequality_mconstraint__
_nlo_copy
_nlo_copy_
_nlo_copy__
_nlo_create
_nlo_create_
_nlo_create__
.....
(snip)
I then try to compile the example provided in the tutorial ("Example in
Fortran", two subroutines and one main program), calling the Fortran compiler:
3. ifort nlopttest.f90 libnlopt-0.lib
This gives an error message:
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
-out:nlopttest.exe
-subsystem:console
nlopttest.obj
libnlopt-0.lib
nlopttest.obj : error LNK2019: unresolved external symbol _NLO_CREATE
referenced in function _MAIN__
nlopttest.obj : error LNK2019: unresolved external symbol _NLO_GET_LOWER_BOUNDS
referenced in function _MAIN__
nlopttest.obj : error LNK2019: unresolved external symbol _NLO_SET_LOWER_BOUNDS
referenced in function _MAIN__
nlopttest.obj : error LNK2019: unresolved external symbol
_NLO_SET_MIN_OBJECTIVE referenced in function _MAIN__
nlopttest.obj : error LNK2019: unresolved external symbol
_NLO_ADD_INEQUALITY_CONSTRAINT referenced in function _MAIN__
nlopttest.obj : error LNK2019: unresolved external symbol _NLO_SET_XTOL_REL
referenced in function _MAIN__
nlopttest.obj : error LNK2019: unresolved external symbol _NLO_OPTIMIZE
referenced in function _MAIN__
nlopttest.obj : error LNK2019: unresolved external symbol _NLO_DESTROY
referenced in function _MAIN__
nlopttest.exe : fatal error LNK1120: 8 unresolved externals
I asked on the Intel Fortran forum and it was suspected that the "linker name
that Fortran generated for the references to the procedures are not the same as
the actual symbol names in the DLL. What I suspect is going on is that the
linker symbol name that Fortran generates for the references to the procedures
in your library are not the same as the actual symbol names in the DLL. Unless
the DLL was generated from Fortran source compiled by the same compiler, you
generally need to provide the compiler of code that uses the DLL with
additional information, typically via INTERFACE blocks, about the calling
conventions associated with the procedures in the DLL (calling convention
including aspects such as how to map the name of something in source code to a
linker symbol name, amongst other important things".
Any help would be appreciated. Many thanks.
Kind Regards
Jon
_______________________________________________
NLopt-discuss mailing list
[email protected]
http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-discuss