获取墙钟时间的C例程编译报错问题求助
解决walltime.c编译错误的方案
1. 修复‘NULL’未声明错误
NULL的定义包含在<stdlib.h>、<stddef.h>等头文件中,你添加<stddef.h>的做法是有效的,也可以替换为更常用的<stdlib.h>,确保编译时能识别NULL宏。
2. 修复“undefined reference to `main'”链接错误
这个C例程是为Fortran调用设计的辅助模块,本身没有main函数(程序入口),所以不能直接用gcc walltime.c -o walltime编译成可执行文件。正确的处理方式是编译成目标文件或库文件,供Fortran链接使用:
编译成目标文件(最直接)
执行以下命令生成.o目标文件,后续Fortran编译时将其纳入链接流程:
gcc -c walltime.c -o walltime.o
编译成静态库
如果需要复用这个模块,可打包成静态库:
gcc -c walltime.c ar rcs libwalltime.a walltime.o
之后Fortran编译时通过-lwalltime参数链接该库。
编译成共享库
生成动态共享库的命令:
gcc -fPIC -c walltime.c gcc -shared -o libwalltime.so walltime.o
使用时需确保库文件在系统可检索路径,或编译时用-L. -lwalltime指定库路径和名称。
额外提示:Fortran与C的调用兼容性
由于代码用于Fortran调用,需保证函数命名符合跨语言交互规则:
- 若使用GCC系列的
gfortran编译器,默认会将Fortran函数名转为小写并添加下划线,因此C函数名需对应为walltime_(若Fortran中调用CALL WALLTIME(...)); - 更稳妥的方式是在Fortran中使用
BIND(C)属性显式指定C函数名,避免命名混淆。
示例C函数实现(补充完整逻辑):
#include <stdlib.h> #include <time.h> void walltime(double *timestamp) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); *timestamp = ts.tv_sec + (double)ts.tv_nsec / 1e9; }
示例Fortran调用代码:
program test_walltime implicit none interface subroutine walltime(t) bind(C) use, intrinsic :: iso_c_binding real(c_double), intent(out) :: t end subroutine walltime end interface real(c_double) :: t call walltime(t) print *, "Timestamp: ", t end program test_walltime
编译Fortran程序时链接C目标文件:
gfortran test.f90 walltime.o -o test
内容的提问来源于stack exchange,提问作者skirthy
相关产品推荐
相关产品推荐

