【问题标题】:Error linking Howard Hinnant's date/time zone library链接 Howard Hinnant 的日期/时区库时出错
【发布时间】:2020-08-17 18:27:28
【问题描述】:

我正在尝试安装Howard Hinnant's date/time zone library,以便我可以制作一个显示不同时区时间的程序。我正在使用 Howard 的 installation guide 进行时区解析器,但考虑到我对 C++ 和一般编程仍然很陌生,我意识到我可能做错了一些事情。

到目前为止,我已经从 GitHub 下载了源材料,并且我相信我在 Visual Studio Code 中成功编译了tz.cpp(同时链接到源材料中提供的头文件)。我没有选择自定义构建。

然后我尝试运行以下示例程序(在安装指南中提供):

#include "date/tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    auto t = make_zoned(current_zone(), system_clock::now());
    std::cout << t << '\n';
}

我的控制台上的“问题”窗口下没有显示错误;但是,终端上会出现以下文本:


C:\Users\kburc\AppData\Local\Temp\ccqDCN6j.o: In function `main':
c:/Users/kburc/Vol 7/Documents/!Dell64docs/Programming/CPP/KJB3programs/CLClockv2/CLClockv2.cpp:26: undefined reference to `date::current_zone()'
C:\Users\kburc\AppData\Local\Temp\ccqDCN6j.o: In function `date::sys_info date::time_zone::get_info<std::chrono::duration<long long, std::ratio<1ll, 1000000000ll> > >(std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long, std::ratio<1ll, 1000000000ll> > >) const':
c:/Users/kburc/Vol 7/Documents/!Dell64docs/Programming/CPP/KJB3programs/CLClockv2/date/tz.h:896: undefined reference to `date::time_zone::get_info_impl(std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long, std::ratio<1ll, 1ll> > >) const'       
collect2.exe: error: ld returned 1 exit status
The terminal process "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -Command & 'C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin\g++.exe' -g 'c:\Users\kburc\Vol 7\Documents\!Dell64docs\Programming\CPP\KJB3programs\CLClockv2\CLClockv2.cpp' -o 'c:\Users\kburc\Vol 7\Documents\!Dell64docs\Programming\CPP\KJB3programs\CLClockv2\CLClockv2.exe'" terminated with exit code: 1.

Terminal will be reused by tasks, press any key to close it.

[对格式的道歉]

任何关于我可能做错或失败的指针将不胜感激。如有必要,很高兴提供更多信息。谢谢!

编辑:这是我的launch.json 文件:

  "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe build active file"
        }
    ]
}

这是我的tasks.json 文件:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [

        {
            "name": "g++.exe - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [
                "-g",
"${workspaceFolder}\\*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe build active file"
        }
    ]
}

【问题讨论】:

  • 看来你需要链接一个库。你的编译/链接命令行是什么?
  • 听起来确实可能是问题所在。我很尴尬地说我不确定我的编译/链接命令行是什么。当我在 Visual Studio Code 中调试程序时,我只需按 F5 并使用 launch.json 文件(我已将其作为问题的编辑包含在内)。
  • 其实sounds likeHoward 只是在他的编译命令行中包含src/tz.cpp 而不是链接库。
  • launch.json 不包含构建配置。
  • tasks.json 是我们需要的文件,可能是配置错误的文件。默认情况下,除非您修改 tasks.json,否则 Visual Stduio Code 将仅编译活动文件。此处的说明:https://code.visualstudio.com/docs/cpp/config-mingw#_modifying-tasksjson 解释所需的更改。

标签: c++ visual-studio-code chrono zone


【解决方案1】:

程序编译正确,但没有链接:

In function `main':
  undefined reference to `date::current_zone()'

In function `date::sys_info date::time_zone::get_info<...>(...) const':
  undefined reference to `date::time_zone::get_info_impl(...) const'

error: ld returned 1 exit status

因此,该问题与运行程序无关,因为该程序尚不存在。

命令行是:

g++.exe -g CLClockv2.cpp -o CLClockv2.exe

其中不包含任何链接标志 (-l),这意味着 GCC 在找不到所需符号时不会链接库并产生您在上面看到的错误。通常,您还需要一个搜索路径标志 (-L)。


我建议你在尝试手动配置像 VS Code 这样的 IDE 之前学习从命令行编译。另一种选择是预配置了 MSVC 的 Visual Studio。

【讨论】:

    【解决方案2】:

    更新:我能够让程序按需要运行,部分归功于 Acorn 的反馈。事实证明,我需要进行一些更改。

    首先,我需要在程序中包含 tz.cpp。

    其次,我需要编辑我的构建命令,不仅要添加 tz.cpp,还要添加 -lole32(感谢https://github.com/HowardHinnant/date/issues/272 的 denchat 指出这一点)。这可以在命令提示符下完成 g++ CLClockv2.cpp tz.cpp -lole32 -o CLClockv2.exe 或在 Visual Studio Code 中使用以下 tasks.json 文件:

    {
        "version": "2.0.0",
        "tasks": [
            {
                "type": "shell",
                "label": "C/C++: g++.exe build active file",
                "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe",
                "args": [
                    "-g",
    "${workspaceFolder}\\*.cpp",
    "-lole32",
    "-o",
    "${fileDirname}\\${fileBasenameNoExtension}.exe"
                ],
                "options": {
                    "cwd": "${workspaceFolder}"
                },
                "problemMatcher": [
                    "$gcc"
                ],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            }
        ]
    }
    

    但是,我随后发现我需要从 https://www.iana.org/time-zones 下载时区数据库的副本(“仅数据”版本适用于我),然后将其解压缩到名为 tzdata 的下载文件夹中。

    最后,我需要创建一个名为 windowsZones.xml 的文件(可在 https://github.com/unicode-org/cldr/blob/master/common/supplemental/windowsZones.xml 获得)并将其包含到下载文件夹中。

    一旦我采取了所有这些步骤,我就能让程序运行起来。

    再次感谢您的帮助!

    【讨论】:

    • 感谢您回来撰写文章!
    • 没问题!谢谢您的回答!我说“部分感谢”的原因很简单,在代码最终运行之前,我还需要解决其他潜在问题
    • 是的,完全没问题! :) 正如一些人所说,魔鬼在细节中。我很高兴它现在对你有用。如果您在 Windows 中,还可以考虑尝试 Visual Studio(我不使用它,但它是 Windows 中的“C++ IDE”)。
    • 是的,实际上我最终选择了 Visual Studio Community 2019 来获取我在 Github 上发布的程序版本,因为我的朋友在使用在 Visual Studio Code 上创建的版本时收到了错误消息。但我很高兴这次经历教会了我更多关于通过 Code 编译程序的知识
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多