You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取墙钟时间的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:05:00