新浪博客

CMake编译Fortran77的方法

2025-05-15 13:02阅读:
项目中有fortran和c代码混编,以前不用cmake,现在想切到cmake,发现项目中用的老编译器,VS不认,不能同时编c和fortran。
于是有了本文,网上找的方法,创建两个工程,A和AFortran,A依赖AFortran,AFortran生成所有fortran的obj,A把自己的c和AFortran生成的obj混合在一起产生动态库。
function(add_neue_dyn_target)
file(GLOB SOURCES '*.c' '*.cxx' '*.cpp' '*.f')
add_library(${my_lib_name} SHARED ${SOURCES})
if(UNIX)
if(NOT ARGN)
set_target_properties(${my_lib_name} PROPERTIES
LINK_FLAGS '${LINK_FLAGS} -Wl,--no-undefined -Wl,--whole-archive ${IDEAS_ROOT}/../olb/z${purelib_name}.a -Wl,--no-whole-archive')
pan> endif()
endfunction(add_neue_dyn_target)
function(neue_use_safeseh my_lib_name)
target_link_options(${my_lib_name} PRIVATE '/SAFESEH:NO')
endfunction(neue_use_safeseh)
function(neue_build_fortran_from_source my_lib_name)
if(WIN32)
file(GLOB F_SOURCES '*.f')
foreach(F_SOURCE_FILE ${F_SOURCES})
get_filename_component(FILENAME '${F_SOURCE_FILE}' NAME_WE)
add_custom_command(
OUTPUT '${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.o'
COMMAND '${CMAKE_Fortran_COMPILER}' /DWINNT /D_X86_ /DWIN32 /DNONXP /D_AFXDLL ... -IXXX /c /Fo'${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.o' '${F_SOURCE_FILE}'
DEPENDS '${F_SOURCE_FILE}'
COMMENT 'Building Fortran file with custom command: ${FILENAME}.f'
)
endforeach(F_SOURCE_FILE)

set(OBJECTS_FILES '')
foreach(F_SOURCE_FILE ${F_SOURCES})
get_filename_component(FILENAME '${F_SOURCE_FILE}' NAME_WE)
list(APPEND OBJECT_FILES '${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}.o')
endforeach()

target_sources(${my_lib_name} PRIVATE ${OBJECT_FILES})
neue_use_safeseh(${my_lib_name})
add_custom_target(${my_lib_name}Fortran ALL DEPENDS ${OBJECT_FILES})
add_dependencies(${my_lib_name} ${my_lib_name}FORTRAN)
endif()

我的更多文章

下载客户端阅读体验更佳

APP专享