【问题标题】:Unresolved externals with static library in Visual Studio (f2c)Visual Studio (f2c) 中带有静态库的未解析外部
【发布时间】:2019-06-27 11:31:04
【问题描述】:

我已成功使用f2c.exe 将一些 Fortran *.f 文件转换为 *.c 文件。我确保每个 C 文件中都有 #include "f2c.h" exists,并在 MS VS2008 中添加了包含该头文件的目录:Properties -> C/C++ -> General -> Additional Include Directories

问题开始于源文件中存在的所有 f2c IO 和数学函数报告的未解决的外部符号错误: s_rsue, e_rsue, s_rsfe, do_uio, f_close, do_fio, do_lio, f_open, s_stop, pow, pow_ri, sqrt, log, exp, tanh, cos, acos

我读到here 必须先由downloading libf2c 生成静态库文件vcf2c.lib。所以我使用nmake in VS2008 运行makefile.vc 并生成vcf2c.lib,然后我将其复制到我的项目目录并添加到Configuration Properties -> Linker -> Input -> Additional Dependencies 下,但我仍然得到与以前相同的未解析的外部符号。

我是否正确构建了这个库,以便 Visual Studio 能够识别其中的函数?我在这里想念什么?添加这个库似乎有效果。感谢您的帮助。

错误示例:

error LNK2019: unresolved external symbol "long __cdecl e_rsue(void)" (?e_rsue@@YAJXZ) referenced in function _main
error LNK2019: unresolved external symbol "long __cdecl do_uio(long *,char *,long)" (?do_uio@@YAJPAJPADJ@Z) referenced in function _main
error LNK2019: unresolved external symbol "long __cdecl s_rsue(struct cilist *)" (?s_rsue@@YAJPAUcilist@@@Z) referenced in function _main
error LNK2019: unresolved external symbol "double __cdecl log(double)" (?log@@YANN@Z) referenced in function _main
error LNK2019: unresolved external symbol "double __cdecl sqrt(double)" (?sqrt@@YANN@Z) referenced in function "int __cdecl calcfl_(void)" (?calcfl_@@YAHXZ)
error LNK2019: unresolved external symbol "double __cdecl cos(double)" (?cos@@YANN@Z) referenced in function "int __cdecl waveno_(float *,float *)" (?waveno_@@YAHPAM0@Z)

编辑:我一直在尝试诊断库文件本身的任何问题。我什至尝试下载version that was compiled by someone else,但仍然无法解决外部问题。以下是运行 dumpbin 的结果:

dumpbin /exports vcf2c.lib

Dump of file vcf2c.lib

File Type: LIBRARY
  Summary
    18A0 .bss
     246 .data
    1110 .debug$F
    513C .debug$S
    1C17 .drectve
     B73 .rdata
    A5BD .text

我不知道这意味着什么。当我使用 /ALL 标志运行它时,我可以在其中看到所需的函数名称,但同样,我不确定如何确定它是否正确。源代码函数和库函数之间是否存在某种不匹配? 16 位与 32 位、C 与 C++ 生成文件选项?

【问题讨论】:

  • 在这里遇到同样的问题!但令人惊讶的是,我可以编译 64 位版本但不能编译 32 位版本..

标签: c++ visual-studio-2008 makefile static-libraries f2c


【解决方案1】:

一定是调用约定的问题!只需确保使用相同的调用约定(_cdecl 或 _stdcall)导出函数,否则使用与导出函数相同的调用约定。

【讨论】:

  • 由于这些函数是在库中定义的(我认为是使用 _cdecl),那么我在 VS 中的代码可能会尝试使用 _stdcall 或 _fastcall 调用它们。我将如何指示调用使用 _cdecl?
  • @MasterHD 这只是编译时使用的标志。(/Gz) 用于 __stdcall。 (/Gd) 用于 __cdecl。参考msdn.microsoft.com/en-us/library/zkwh89ks.aspx
  • 看起来 VS 已经在使用 (/Gd) __cdecl,当我尝试将其更改为 __fastcall (/Gr) 或 __stdcall (/Gz) 时,它给出:“警告 C4007:'main' : 必须是 '__cdecl'"。不过,我已经继续前进了,因为无论如何我手动将所有 f2c 函数转换为本机 C 函数。这很乏味,但现在看起来更干净了,所以我可能会删除这个问题,因为我永远不知道实际问题是什么。
猜你喜欢
  • 2011-12-24
  • 1970-01-01
  • 2020-04-30
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 2016-01-23
  • 2020-07-01
相关资源
最近更新 更多