[CMake] FortranCInterface not working with 3.9.0 with Intel 2015
Brad King
brad.king at kitware.com
Tue Dec 12 07:50:37 EST 2017
On 12/11/2017 04:34 PM, John Cary wrote:
> Bill Hoffman wrote:
>> LINK: command "xilink ... /out:FortranCInterface.exe ..." failed (exit code 1169)
>> LIBCMT.lib(winapisupp.obj) : error LNK2005:
>> __crtSetUnhandledExceptionFilter already defined in MSVCRT.lib(MSVCR120.dll)
>>
>> Did you change any of the default compiler/linker flags? It looks like
>> it is mixing run time libraries somehow.
>
> Yes, we do a replacement of MD with MT as we need fully static builds.
>
> We do this early in configuration, using
>
> The "Dynamic Replace" method described at
>
> https://cmake.org/Wiki/CMake_FAQ#Dynamic_Replace
>
> This is possible with 3.8.2. Is there a way to get that behavior back?
This is likely due to commit v3.9.0-rc1~144^2~1:
```
FortranCInt: Pass CONFIG flags to try_compile
This change ensures that Intel Fortran's /libs: in
CMAKE_Fortran_FLAGS and Visual C++'s /MT or /MD in the
CMAKE_C_FLAGS_RELEASE do not conflict with each other.
```
With that change I'm able to reproduce the failure with
VS 2013 and Intel 2016:
```
cmake_minimum_required (VERSION 3.7)
project(Test C Fortran)
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
include(FortranCInterface)
FortranCInterface_VERIFY()
```
If the project is changing the C and C++ flags to use a static
runtime library, it should do that for Fortran too:
```
string(REPLACE "/libs:dll" "/libs:static" CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS}")
```
Adding that line fixes the problem for me.
-Brad
More information about the CMake
mailing list