gpt4 book ai didi

c++ - 解决 fortran 子例程的 C++ 包装器库之间的非唯一符号

转载 作者:行者123 更新时间:2023-11-28 03:45:31 25 4
gpt4 key购买 nike

我正在使用两组 FORTRAN 代码,例如 codeA.f 和 codeB.f。在每组代码中都有同名的子例程,但它们执行截然不同的任务(以及公共(public) block )。

codeA.f:

     subroutine init
c do something here ...
end

代码B.f:

     subroutine init
c do something else here ...
end

我为两个例程创建了两个 C++ 包装器(wrapperB 是相同的,但将 B 换成 A)。

wrapperA.cpp:

namespace codeA {
extern "C"{void init_();}
void init() {init_();}
}

wrapperA.h:

namespace codeA {
init();
}

然后我将这两个包装器编译到共享库中。

生成文件:

codeA.o : codeA.F
g77 -fno-automatic -fPIC -O3 -c codeA.f -o codeA.o
wrapperA.o : wrapperA.cpp
g++ -fPIC -c wrapperA.cpp -o wrapperA.o
libwrapperA.so : codeA.o wrapperA.o
g++ -fPIC -shared -lg2c codeA.o wrapperA.o -o libwrapperA.so

最后,我希望能够从同一个程序中调用两个不同的子例程。

主要.cpp:

#include "wrapperA.h"
#include "wrapperB.h"
main {
wrapperA::init();
wrapperB::init();
}

主程序链接到两个共享包装器库。

生成文件:

main : main.cpp
g++ main.cpp -I. -L. -lwrapperA -lwrapperB -o main

一切都会编译,没有任何提示。然而,当程序“main”运行时,init() 命令执行相同的操作,由首先链接到哪个包装器库决定。但是,如果我只链接到其中一个库,链接器会提示缺少符号。

我有两个问题:

a) 是否可以仅使用 namespace 或与我正在做的类似的方法链接两个不同的 FORTRAN 例程?如果是这样,我做错了什么?

b) 如果 a) 不可能,是否可以通过指示编译器在创建 FORTRAN 对象时为符号附加一些唯一标识符来解决冲突(我使用的是 gcc 版本 4.1.2 20080704(Red Hat 4.1 .2-51))?

感谢您对此的任何见解。

最佳答案

您的编译命令显示使用了不再维护的 g77,并且还暗示使用了非常旧版本的 Fortran(即 FORTRAN 77)。您还在使用旧版本的 gcc。如果您使用 4.3 或更高版本的 gcc 和 gfortran——最好是 4.4 或更高版本——那么您可以使用 Fortran 2003 ISO C 绑定(bind)来解决您的问题。在 Fortran 代码中,您可以使用 ISO C 绑定(bind)的“绑定(bind)”选项将外部可见的名称分配给例程。只需为两个例程分配不同的“绑定(bind)”名称即可。这样它们就不会在库和链接器级别发生冲突:

在一个 Fortran 文件中使用

subroutine init (stuff...) bind (C, name="init_V1")

和另一个文件

subroutine init (stuff...) bind (C, name="init_V2")

并且这些例程将作为 init_V1 和 init_V2 对 C、C++、链接器等可见,而不会发生冲突。

关于c++ - 解决 fortran 子例程的 C++ 包装器库之间的非唯一符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7824754/

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