我想将一些常用的Fortran代码编译到一个静态库中(假设我将同时访问var frame = new DispatcherFrame();
var t = Task.Run(
async () => {
await Task.Delay(TimeSpan.FromSeconds(1.5));
frame.Continue = false;
});
Dispatcher.PushFrame(frame);
t.Wait();
和*.mod
文件)。
这工作了。
但是,我在链接时遇到了问题。
这里是一个例子。假设我有*.a
个文件:
mylib.f90
哪个编译为
MODULE MYLIB
IMPLICIT NONE
CONTAINS
INTEGER FUNCTION FOO(N)
INTEGER, INTENT(IN) :: N
FOO = N + 2
END FUNCTION FOO
END MODULE MYLIB
现在,我有一个使用gfortran -c mylib.f90
ar rcs libmylib.a mylib.o
函数的程序:
FOO
为简单起见,我将其与PROGRAM MYPROG
USE MYLIB
IMPLICIT NONE
INTEGER M
M = FOO(3)
WRITE (*,*) M
END PROGRAM MYPROG
和mylib.mod
放在同一目录中。编译:
libmylib.a
没有问题。链接,但是会导致错误:
gfortran -c myprog.f90
但是,gfortran -L./ -lmylib myprog.o
myprog.o: In function `MAIN__': myprog.f90:(.text+0x11): undefined
reference to `__mylib_MOD_foo' collect2: error: ld returned 1 exit
status
中有符号__mylib_MOD_foo
:
libmylib.a
,如果我给它nm libmylib.a
mylib.o:
0000000000000000 T __mylib_MOD_foo
,它可以毫无问题地编译。我在做什么错了?
PS。我见过某处,但现在找不到链接的方式如下:
mylib.o
有效。但是它应该用弱符号解决问题,而gfortran -Wl,--whole-archive libmylib.a -Wl,--no-whole-archive myprog.o
的输出不会将nm
标记为弱。