【问题标题】:Can't get ms _tzSet() example to compile无法编译 ms _tzSet() 示例
【发布时间】:2020-09-13 00:33:58
【问题描述】:

我在 Windows 10 pro 上使用 c++ builder 10.2 和 clang 编译器。谁能告诉我为什么这不能编译?

// crt_tzset.cpp
// This program uses _tzset to set the global variables
// named _daylight, _timezone, and _tzname. Since TZ is
// not being explicitly set, it uses the system time.

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main( void )
{
    _tzset();
    int daylight;
    _get_daylight( &daylight );
    printf( "_daylight = %d\n", daylight );
    long timezone;
    _get_timezone( &timezone );
    printf( "_timezone = %ld\n", timezone );
    size_t s;
    char tzname[100];
    _get_tzname( &s, tzname, sizeof(tzname), 0 );
    printf( "_tzname[0] = %s\n", tzname );
    exit( 0 );
}

我收到 3 个与 _get_daylight、_get_timezone 和 _get_tzname 相关的“未解决的外部”错误。

【问题讨论】:

  • Unresolved external 表示链接器错误,而不是编译错误 - 对吗?如果您查找它,您会发现 __get_daylight 包含在 Universal C 运行时中。这意味着您可能不会链接到它。现在它取决于您的项目/IDE 如何进行链接。
  • 我不怀疑 Wolfgang 的话,但我在 IDE 的项目管理器中看不到这样的选项。我以前从未遇到过这种情况,也不知道这个 C 运行时库存在于哪里。希望我不必下载 Visual ******* C。
  • 如果您查看 _tzset() 及其同伴的文档,至少应该有两件事:要包含哪个 头文件 以使编译器知道它们,以及要链接到哪个。 -- 你的项目经理(我不知道 c++builder)当然有一些方法可以让你定义要链接的库。您需要寻找“库”,而不是“tzset”。
  • @the busybee 我一直在寻找但只能找到#nclude
  • 读了stackoverflow.com/questions/2766233/…之后我一点也不聪明。

标签: c++ c windows c++builder


【解决方案1】:

由于我没有“c++builder”,所以我用 MinGW 进行了尝试。

使用如下简单的编译和链接命令:

gcc -Wall -Werror -pedantic -O2 tz.c -o tz

我遇到了同样的错误:

C:\Users\###\AppData\Local\Temp\ccI8j8Mj.o:tz.c:(.text.startup+0x1f): undefined reference to `__imp__get_daylight'
C:\Users\###\AppData\Local\Temp\ccI8j8Mj.o:tz.c:(.text.startup+0x3a): undefined reference to `__imp__get_timezone'
C:\Users\###\AppData\Local\Temp\ccI8j8Mj.o:tz.c:(.text.startup+0x61): undefined reference to `__imp__get_tzname'
collect2.exe: error: ld returned 1 exit status

单个 grep 显示库 libucrtbase.a(以及其他)包含符号 _get_daylight。将此库添加到命令中:

gcc -Wall -Werror -pedantic -O2 tz.c -lucrtbase -o tz

这产生了一个可运行的程序。

其他库都是libmsvcr*.a,不同版本,我只试了其中一个。这也成功了。


编辑:

有了一个不太流行的“clang”,我什至不需要添加库。

clang -Wall -Werror -pedantic -O3 tz.c -o tz-clang.exe

这个编译和链接没有任何错误并且运行完美。

(clang 版本 7.0.1(tags/RELEASE_701/final),目标:x86_64-pc-windows-msvc)

【讨论】:

  • "如果我什至知道库文件的名称,我可以搜索我的硬盘驱动器,然后将其添加到 IDE 中" - 这就是 grep 工具的优点。它们允许您搜索文件的内容以查找要查找的关键字。因此,您可以尝试 grepping IDE 提供的库以查找 get_daylightget_timezoneget_tzname
  • 那行不通。 .DLL 是要添加的错误文件,您需要一个 .LIB.A 文件,具体取决于您正在编译的平台。 MSVCR 是 Microsoft Visual C 运行时库,无论如何您都不想添加它。 /bin 文件夹包含属于 IDE 本身的文件,它不包含您可以添加到自己项目中的文件。远离那个文件夹。 MSVCR 是 IDE 的 SubVersion 集成的依赖项。 /lib 文件夹包含您可以添加到项目中的文件。你有没有像我之前建议的那样尝试搜索get_daylight(没有领先的_s)?
  • @NoComprende 您确定您的 IDE 使用 Clang 作为编译器吗?它安装在哪里?它是哪个版本?您对该项目的图书馆选择的研究揭示了什么?
  • 我的意思是,不管链接器说什么,您是否在/lib 的文件中找到了get_daylight substring anywhere文件夹?如果没有,那么可能 Embarcadero 可能忘记发送相关的 lib 文件(它发生了),谁知道呢。真正的问题是,您为什么首先尝试使用这些供应商特定的功能,而不是更标准化的东西?
  • c++builder 在构建时是否显示构建控制台?大多数 IDE 都可以。您可以查看执行了哪些命令来编译和链接。这应该显示使用的编译器。 -- 无论如何,在 c++builder 之外尝试一下怎么样?在涉及至少 两个 野兽(IDE 和编译器系统)的情况下,调试您的设置似乎太难了。请考虑从命令行编译和链接您的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2011-07-23
  • 2018-12-02
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多