gpt4 book ai didi

c++ - 使用 CMake 链接 fortran 和 c++ - 跳过不兼容的...错误

转载 作者:行者123 更新时间:2023-12-04 08:04:00 25 4
gpt4 key购买 nike

一位同事确实给我发了一个 Fortran 函数以包含在我的 C++ 程序中。
到目前为止,我的程序中的所有内容都是用 C++ 编码的。
为了简单起见(尤其是依赖项和安装),我想我会用 C++ 重新编码。
不幸的是,代码非常复杂,有许多 goto声明和其他我不太熟悉的东西。 (我从未使用过 Fortran,这是来自一个古老的科学 Fortran 77 程序)
因此,我想直接在 C++ 中调用 Fortran 函数。
一个先决条件是,我正在为我的程序使用 CMake,并且所有内容(如链接)都必须在 CMake 文件中完成。此外,CMake 文件应尽可能简单,因为只有科学家在没有复杂的编程背景的情况下工作和扩展程序。
我在互联网上找到了许多方法和解决方案 - 但是,大多数处理模块和库都非常复杂 - 我只需要调用一个函数,我们不使用库等。
不幸的是,我在执行代码时遇到了很多错误:

c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:skipping incompatible C:/MinGW/lib/gcc/mingw32/6.3.0/libgfortran.dll.awhen searching for -lgfortranc:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:skipping incompatible C:/MinGW/lib/gcc/mingw32/6.3.0/libgfortran.awhen searching for -lgfortranc:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:skipping incompatible C:/MinGW/lib/gcc/mingw32/6.3.0\libgfortran.awhen searching for -lgfortranc:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:skipping incompatible C:/MinGW/lib/gcc/mingw32/6.3.0/libgfortran.dll.awhen searching for -lgfortranc:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:skipping incompatible C:/MinGW/lib/gcc/mingw32/6.3.0/libgfortran.awhen searching for -lgfortranc:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:cannot find -lgfortran


我的主要问题是: 这些错误是由于我的代码中的问题还是与我的环境问题有关?
这就是我的代码的样子:
主文件
#include <iostream>

extern double f_add(double *, double *, double *);

int main() {
double a = 1.;
double b = 2.;
double c;
f_add(&a, &b, &c);

std::cout << c << std::endl;
}
f_add.f
  real function f_add(a, b, c)
real a,b,c
c = a+b
end
CMakeLists.txt
cmake_minimum_required(VERSION 3.17)
project(test_cpp)

set(CMAKE_CXX_STANDARD 14)
SET (CMAKE_Fortran_COMPILER gfortran)
ENABLE_LANGUAGE(Fortran)

set(SOURCE_FILES
main.cpp
f_add.f
)

add_executable(test_cpp ${SOURCE_FILES})

最佳答案

我认为您的 C++ 代码丢失了 extern "C"以及对 Fortran 代码的一些额外更正。例如,以下将起作用:

#include <iostream>
extern "C" {
double f_add(double, double);
}
int main() {
double a = 1.;
double b = 2.;
double c;
c = f_add(a, b);
std::cout << c << std::endl;
}
和,
function f_add(a, b) result(c) bind(C, name = "f_add")
use iso_c_binding, only: c_double
implicit none ! remove this line if your F77 code has implicitly-declared variables.
real(c_double), intent(in), value :: a, b
real(c_double) :: c
c = a + b
end function f_add
然后编译、链接和运行(通过我正在使用的 MinGW GNU 10.1),
gfortran -c f_add.f90
g++ -c main.cpp
g++ *.o -o main.exe
./main.exe
输出是,
3
我没有在 MinGW 中安装 CMake,但是通过上述修改设置它应该很简单。如果有帮助,您的 CMake 文件在 Linux 环境中可以完全正常工作。

关于c++ - 使用 CMake 链接 fortran 和 c++ - 跳过不兼容的...错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66313407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com