【问题标题】:Linker can not find __imp_clock and __imp_time64 when building a sample of GTSAM链接器在构建 GTSAM 示例时找不到 __imp_clock 和 __imp_time64
【发布时间】:2024-01-18 01:22:01
【问题描述】:

我在 Windows 中构建 GTSAm,现在我正在尝试使用它构建示例应用程序。

示例应用程序非常简单(它是 GTSAM 的一部分),但是当我运行它时,我收到了这个链接器错误:

Severity    Code    Description Project File    Line    Suppression State Error LNK2019 unresolved external symbol __imp_clock referenced in function gk_CPUSeconds example D:\MyData\SourceCode\gtsam_win\cmake\example_cmake_find_gtsam\build\metis-gtsamDebug.lib(timers.obj)    

Severity    Code    Description Project File    Line    Suppression State Error LNK2019 unresolved external symbol __imp__time64 referenced in function time    example D:\MyData\SourceCode\gtsam_win\cmake\example_cmake_find_gtsam\build\metis-gtsamDebug.lib(timers.obj)    1   

搜索显示这两个函数是 MSVC 库的一部分,它们应该链接到系统。

我该如何解决这个问题?

问题似乎是库构建和应用程序构建期间的设置不匹配,但我找不到任何不同的链接器设置。在哪里寻找任何这样的差异?

【问题讨论】:

  • 也许您正在使用多线程运行时 (/MT) 而不是多线程 DLL (/MD) 构建应用程序? (C++ -> 代码生成 -> 运行库)__imp_ 前缀表示该库是使用 DLL 运行时构建的。
  • @dewaffled 这解决了我的问题。关键信息是 __imp) prefioc 意味着库是用 DLL 构建的。原因是我修复了 /MT 和 /MD 不匹配的错误,所以我认为这不是问题。这条消息给了我一个线索,我应该再次查看它,我发现在 GTSAM 中,GTSAM 和 metis-gtsam 在创建库时使用不同的设置存在错误。当我收到错误消息并修复它时,它与 gtsam 运行良好,但 gtsam-metis 具有不同的设置,并且仍然使用 /md 创建。有趣的是,没有链接器错误抱怨这个。
  • @dewaffled 请提出这个作为答案,我会接受。

标签: visual-c++ cmake linker gtsam


【解决方案1】:

链接库中未解析的外部运行时库符号中的__imp_ 前缀表示该库是使用 DLL 运行时构建的(C++ -> Code Generation -> Runtime Library 中的/MD)。

如果您使用静态运行时 (/MT) 构建应用程序,来自 DLL 运行时的符号将无法解析。所有编译单元的运行时设置应该相同。

【讨论】: