[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