我們當前的解決方案是Visual Studio 2013中的混合C++ Fortran應用程序,每個應用程序大約有40個項目。混合的Fortran/C++解決方案中可以安全地忽略LNK4006警告嗎?
雖然我們可以構建解決方案就好了,我們得到約6000警告 - 絕大多數這些都是LNK4006警告,其中一個功能被「複製」:
warning LNK4006: [email protected] already defined in project1.lib(module1.obj); second definition ignored project2.lib(module1.obj)
的共同點是,正在複製的功能在Fortran的模塊中定義的 - 其中許多是隻是接口到C++函數:
MODULE mINTERFACES
USE ISO_C_BINDING
INTERFACE
INTEGER(4) FUNCTION GetLastErrorCode [C, ALIAS: '_GetLastErrorCode'] (index)
USE ISO_C_BINDING
INTEGER(C_SIZE_T), INTENT(IN) :: index
END FUNCTION GetLastErrorCode
END INTERFACE
END
由於這些模塊在許多的Fortran項目中使用的,每個項目具有接口功能的一個獨立的版本 - H因爲重複。
這一切都很合理,但我的問題是:我可以忽略警告(即在項目配置中排除它們)嗎?我看不出任何明顯的方式來重組我們的代碼來刪除警告,我的印象是,將這些接口放在一個模塊中是很好的做法...
'[C,ALIAS:'_GetLastErrorCode']'是什麼語法?你如何在C++中定義函數?你用'extern「C」'? –
這是針對C互操作性的Microsoft Powerstation擴展。語法的一個編譯器,它已經死了二十年,按照Fortran 2003的ISO_C_BINDING的組合做我的頭。 – IanH
Visual Studio中沒有附帶一個Fortran編譯。您正在使用哪種特定的Fortran產品?這樣一個接口塊應該只能產生一個符號引用,而不是一個定義。從錯誤消息中,您看起來在多個庫中具有相同的目標代碼 - 即,您已經編譯了兩次或更多的module1.f90 - 是這種情況嗎? – IanH