在使用CMake链接Fortran和C++时,可能会遇到“跳过不兼容的…”错误。这个错误通常是由于Fortran和C++之间的命名修饰(name mangling)和调用约定不兼容导致的。下面我将详细介绍这个问题的基础概念、原因、解决方法以及相关优势和应用场景。
Fortran和C++使用不同的命名修饰和调用约定,导致链接器无法正确识别和匹配函数。
extern "C"
在C++代码中,可以使用extern "C"
来告诉编译器不要对函数名进行修饰,使其保持C语言的命名风格。
// C++代码
extern "C" {
void fortran_function();
}
在Fortran代码中,可以使用bind(C)
属性来确保函数使用C语言的调用约定。
! Fortran代码
subroutine fortran_function() bind(c)
! 函数体
end subroutine fortran_function
target_link_libraries
在CMakeLists.txt中,可以使用target_link_libraries
来指定链接的库,并确保正确处理命名修饰和调用约定。
cmake_minimum_required(VERSION 3.10)
project(MyProject)
add_library(fortran_lib fortran_module.f90)
add_library(cpp_lib cpp_module.cpp)
add_executable(my_executable main.cpp)
target_link_libraries(my_executable fortran_lib cpp_lib)
假设有一个Fortran模块fortran_module.f90
和一个C++模块cpp_module.cpp
,下面是如何在CMake中正确链接它们的示例。
fortran_module.f90
)module fortran_module
use iso_c_binding
implicit none
contains
subroutine fortran_function() bind(c)
print *, "Hello from Fortran!"
end subroutine fortran_function
end module fortran_module
cpp_module.cpp
)#include <iostream>
extern "C" {
void fortran_function();
}
int main() {
std::cout << "Hello from C++!" << std::endl;
fortran_function();
return 0;
}
cmake_minimum_required(VERSION 3.10)
project(MyProject)
add_library(fortran_lib fortran_module.f90)
add_library(cpp_lib cpp_module.cpp)
add_executable(my_executable main.cpp)
target_link_libraries(my_executable fortran_lib cpp_lib)
通过以上方法,可以有效解决Fortran和C++链接时出现的“跳过不兼容的…”错误,并实现跨语言的高效开发和应用。
领取专属 10元无门槛券
手把手带您无忧上云