Closed DragonPara closed 2 months ago
I meet this error on Mac,how do you fixed it ?
I tried to reproduce the error with the following steps on Windows 11 23H2 (but it built without error for me):
icc
or ifort
didn't install for me with the steps described above):
cmake -DCMAKE_CXX_COMPILER=icx-cl -DCMAKE_C_COMPILER=icx-cl -DSUITESPARSE_ENABLE_PROJECTS="umfpack" --fresh ..
cmake --build . --config Release
ctest . -C Release
Could you please describe the exact steps to reproduce the error that you are seeing?
I meet this error on Mac,how do you fixed it ?
cmake .. DSUITESPARSE_ENABLE_PROJECTS="umfpack" -DSUITESPARSE_USE_CUDA=OFF -DSUITESPARSE_USE_FORTRAN=OFF
I closed CUDA and Fortran, then it worked well.
I tried to reproduce the error with the following steps on Windows 11 23H2 (but it built without error for me):
- Download and install MSVC 2022 (version 17.9.6)
- Download and install Intel oneAPI 2024.1
- Open the "Intel oneAPI command prompt for Intel 64 for Visual Studio 2022" shell with the shortcut in the Windows Start menu.
- Run the following commands (
icc
orifort
didn't install for me with the steps described above):cmake -DCMAKE_CXX_COMPILER=icx-cl -DCMAKE_C_COMPILER=icx-cl -DSUITESPARSE_ENABLE_PROJECTS="umfpack" --fresh .. cmake --build . --config Release ctest . -C Release
Could you please describe the exact steps to reproduce the error that you are seeing?
Thx, I compiled by your commands, but it gave me same error results. tools:
If I set SUITESPARSE_USE_FORTRAN=OFF
, It will compile successfully. Perhaps it's about Fortran?
IIUC, building fails for you when you are trying to use ifort
as the Fortran compiler. The installer that I found for Intel oneAPI 2024.1 didn't give me an option to install ifort
.
Could you please give instructions for how to install ifort
on Windows?
Found a direct download link for the Intel Fortran compilers: https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#fortran
That installed ifort
:
Intel(R) Fortran Intel(R) 64 Compiler Classic for applications running on Intel(R) 64, Version 2021.12.0 Build 20240222_000000
Copyright (C) 1985-2024 Intel Corporation. All rights reserved.
ifort: remark #10448: Intel(R) Fortran Compiler Classic (ifort) is now deprecated and will be discontinued late 2024. Intel recommends that customers transition now to using the LLVM-based Intel(R) Fortran Compiler (ifx) for continued Windows* and Linux* support, new language support, new language features, and optimizations. Use '/Qdiag-disable:10448' to disable this message.
With it, compilation fails for me (but with a different error than what you were showing). I'm using the following commands to configure and build:
cmake -G"Ninja Multi-Config" -DCMAKE_CXX_COMPILER=icx-cl -DCMAKE_C_COMPILER=icx-cl -DCMAKE_Fortran_COMPILER=ifort -DSUITESPARSE_ENABLE_PROJECTS="umfpack" --fresh ..
cmake --build . --config Release
The error is on linking cholmod.dll
:
[630/1250] Linking CUDA shared library CHOLMOD\Release\cholmod.dll
FAILED: CHOLMOD/Release/cholmod.dll CHOLMOD/Release/cholmod.lib
C:\WINDOWS\system32\cmd.exe /C "C:\WINDOWS\system32\cmd.exe /C ""C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E __create_def D:\repo\SuiteSparse\SuiteSparse\build-oneAPI\CHOLMOD\CMakeFiles\CHOLMOD.dir\Release\exports.def D:\repo\SuiteSparse\SuiteSparse\build-oneAPI\CHOLMOD\CMakeFiles\CHOLMOD.dir\Release\exports.def.objs && cd D:\repo\SuiteSparse\SuiteSparse\build-oneAPI" && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E vs_link_dll --intdir=CHOLMOD\CMakeFiles\CHOLMOD.dir\Release --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100226~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100226~1.0\x64\mt.exe --manifests -- C:\PROGRA~1\MIB055~1\2022\COMMUN~1\VC\Tools\MSVC\1439~1.335\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\CHOLMOD.Release.rsp /out:CHOLMOD\Release\cholmod.dll /implib:CHOLMOD\Release\cholmod.lib /pdb:CHOLMOD\Release\cholmod.pdb /dll /version:5.2 /Qoption,link,/machine:x64 /INCREMENTAL:NO -Qiopenmp /Qoption,link,/DEF:CHOLMOD\CMakeFiles\CHOLMOD.dir\Release\exports.def -LIBPATH:"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.3/lib/x64" && cd ."
LINK: command "C:\PROGRA~1\MIB055~1\2022\COMMUN~1\VC\Tools\MSVC\1439~1.335\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\CHOLMOD.Release.rsp /out:CHOLMOD\Release\cholmod.dll /implib:CHOLMOD\Release\cholmod.lib /pdb:CHOLMOD\Release\cholmod.pdb /dll /version:5.2 /Qoption,link,/machine:x64 /INCREMENTAL:NO -Qiopenmp /Qoption,link,/DEF:CHOLMOD\CMakeFiles\CHOLMOD.dir\Release\exports.def -LIBPATH:C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.3/lib/x64 /MANIFEST:EMBED,ID=2" failed (exit code 1181) with the following output:
LINK : warning LNK4044: unrecognized option '/Qoption,link,/machine:x64'; ignored
LINK : warning LNK4044: unrecognized option '/Qiopenmp'; ignored
LINK : warning LNK4044: unrecognized option '/Qoption,link,/DEF:CHOLMOD\CMakeFiles\CHOLMOD.dir\Release\exports.def'; ignored
LINK : fatal error LNK1181: cannot open input file 'AMD\Release\amd.lib'
And there is indeed no amd.lib
(just amd.dll
and amd_static.lib
). It looks like that amd.dll
doesn't export any symbols...
It correctly exports the symbols from amd.dll
using the (modern, LLVM-based) Intel Fortran compiler ifx
:
cmake -DCMAKE_CXX_COMPILER=icx-cl -DCMAKE_C_COMPILER=icx-cl -DCMAKE_Fortran_COMPILER=ifx -DSUITESPARSE_ENABLE_PROJECTS="umfpack" --fresh ..
cmake --build . --config Release
However, using ifx
still fails a bit later on when linking the CHOLMOD demos. That seems to be caused by cholmod.dll
exporting only one single symbol:
>dumpbin /EXPORTS CHOLMOD\Release\cholmod.dll
Microsoft (R) COFF/PE Dumper Version 14.39.33523.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file CHOLMOD\Release\cholmod.dll
File Type: DLL
Section contains the following exports for cholmod.dll
00000000 characteristics
FFFFFFFF time date stamp
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 0003FCEC NvOptimusEnablementCuda
Summary
9000 .data
1000 .nvFatBi
9000 .nv_fatb
1000 .pdata
1D000 .rdata
2000 .reloc
1000 .rsrc
1D000 .text
2000 _RDATA
1000 __nv_mod
4000 __nv_rel
Afaict, that is because /Qoption,link,/DEF:CHOLMOD\CMakeFiles\CHOLMOD.dir\Release\exports.def
is used in the LINK_FLAGS
when linking cholmod.dll
as a CUDA library. That should be /DEF:CHOLMOD\CMakeFiles\CHOLMOD.dir\Release\exports.def
instead (without the prefix /Qoption,link,
).
The same issue with amd.dll
and ifort
. When linking as a Fortran library with ifort
, the LINK_FLAGS
shouldn't contain /Qoption,link,/DEF:AMD\CMakeFiles\AMD.dir\Release\exports.def
. It should be /DEF:AMD\CMakeFiles\AMD.dir\Release\exports.def
instead when using the (non LLVM-based) ifort
(which leads to CMake calling link.exe
directly like for the CUDA library).
That looks like a CMake issue to me. There is probably nothing that SuiteSparse can do about it.
Disabling CUDA leads to cholmod.dll
being linked as a C library. That can be used to work around the issue until this is fixed in CMake.
Similarly, disabling Fortran leads to amd.dll
being linked as a C library. That (or using the LLVM-based ifx
) can be used to work around the issue with the empty amd.dll
.
I didn't find an open ticket for either issue on https://gitlab.kitware.com/cmake/cmake/-/issues.
I opened an issue for CMake: https://gitlab.kitware.com/cmake/cmake/-/issues/26005
I also found Fortran Source file would not be compiled to .obj
file. Looks like Fortran Source file is ignored.
I also found Fortran Source file would not be compiled to
.obj
file. Looks like Fortran Source file is ignored.
I cannot reproduce that. Using the "Ninja Multi-Config" generator, I find, e.g., AMD\CMakeFiles\AMD.dir\Release\Source\amd.f.obj
in the build directory.
The Fortran sources are obviously not built if you configured with -DSUITESPARSE_USE_FORTRAN=OFF
or if CMake doesn't detect any working Fortran compiler. In these cases, you won't find object files that would be built from Fortran sources.
Not sure why this was closed. I can reproduce the issue with the given configuration.
I was hoping that this could be fixed (more or less easily) in CMake. But trying to understand their code, this might be more involved than I initially expected.
A possible workaround might be to set LINKER_LANGUAGE
to C
or CXX
for the targets that (optionally) include Fortran or CUDA objects.
I opened #853 that should work around the issue with that combination of compilers.
Describe the bug Can't compile CHOLMOD
To Reproduce mkdir build cd build
cmake .. -DCMAKE_CXX_COMPILER=icc -DCMAKE_C_COMPILER=icc -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_INSTALL_PREFIX="E:/umfpackCompilerWork/SuiteSparse7.7" -DSUITESPARSE_ENABLE_PROJECTS="umfpack"
the result of cmake stored inconfig.log
config.logmsbuild SuiteSparse.sln /p:Configuration=Release > compile.log
the result of build stored in compile.log compile.logExpected behavior normal compilation
Screenshots
Desktop (please complete the following information):
Additional context I found
-DCMAKE_CXX_COMPILER=icc -DCMAKE_C_COMPILER=icc
also not work.