gpt4 book ai didi

c++ - Windows clang Hello World lnk4217

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:28 30 4
gpt4 key购买 nike

我已经安装了 clang 6.0 版以及 Visual Studio 2017。我正在编译一个简单的“hello world”应用程序:

#include <iostream>

int main()
{
std::cout << "Hello, World!" << std::endl;
return 0;
}

使用
clang hello.cpp

这给了我警告:
hello-d1b2c6.o : warning LNK4217: locally defined symbol __std_terminate 
imported in function "int `public: static unsigned __int64 __cdecl
std::char_traits<char>::length(char const * const)'::`1'::dtor$2"
(?dtor$2@?0??length@?$char_traits@D@std@@SA_KQEBD@Z@4HA)

hello-d1b2c6.o : warning LNK4217: locally defined symbol _CxxThrowException
imported in function "public: void __cdecl std::ios_base::clear(int,bool)"
(?clear@ios_base@std@@QEAAXH_N@Z)

我知道我可以通过使用 clang-cl 来缓解这些警告。 (如建议的 in this SO questionhere ),但是,我不想在没有完全理解其含义的情况下这样做。

所以这是我的实际问题:
  • 这些警告是什么意思或导致它们的原因是什么?
  • 有什么用clang-cl更改以及使用时我必须牢记什么? (我想是有理由不一直使用它的)
  • 是否有其他方法可以不接收这些警告(关闭警告除外)?
  • 最佳答案

    我自己遇到了这个问题并做了一些调查。

    这些警告是什么意思?

    有详细解答here (我不完全理解),但据我所知,高级想法是目标文件( .o 文件)与 clang 之间存在不匹配。编译和正在链接的库文件( .lib 文件)。

    因此,尽管该程序似乎可以运行,但忽略警告可能是个坏主意。

    是什么导致了它们?

    Microsoft 链接器发出警告,link.exe , 其中 clang调用。 Clang 不包含自己的链接器。默认情况下,在 Windows 上,它会查找 Microsoft Visual Studio C 编译器 header 、库和链接器。你可以通过添加 -v 来准确地看到它在做什么。 (详细)切换到 clang命令行。

    我不确定 Clang 如何找到这些工具。我忘了我什至安装了它们,而且它们肯定不在 PATH 上。 .我认为 Clang 一定是以某种方式将它们从注册表中挖出来的。

    使用 clang-cl 有什么变化?

    它更改传递给 Clang 编译器的开关(也称为 clangclang++clang-cl ,但传递了 -cc1 开关)和链接器(MSVC link.exe )。在高层,clang-cl尝试模拟 MSVC cl.exe编译器,而 clang ......做别的事情。我不确定是什么。它不是在模仿 MinGW;见下文。

    详细的区别可以查看各自的-v输出。使用 clang++clang-cl从 LLVM 8.0.1 开始,我看到了这些编译器开关差异:

    clang-cl has but clang++ lacks:
    -relaxed-aliasing
    -mllvm
    -x86-asm-syntax=intel
    -D_MT
    -flto-visibility-public-std
    --dependent-lib=libcmt
    --dependent-lib=oldnames
    -stack-protector 2
    -fms-volatile
    -fdiagnostics-format msvc

    clang++ has but clang-cl lacks:
    -fcxx-exceptions
    -fexceptions

    在链接期间, clang++通行证 -defaultlib:libcmt , 而 clang-cl才不是。

    我看到的最大区别是 clang-cl通行证 -D_MT ,启用线程感知 C 和 C++ 标准库。我认为混合使用和不使用编译的模块是个坏主意 _MT .关于 -fcxx-exceptions 的不匹配也令人担忧,这表明 C++ 异常可能不起作用。
    clang-cl也通过 -flto-visibility-public-stdthis answer推荐的flag到一个相关的问题。我不知道这个标志是只是抑制警告还是显着改变了代码的编译方式。

    使用时需要注意什么?

    据我了解,您想使用 clang-cl当且仅当您希望 Clang 尽最大努力模拟 Microsoft cl.exe编译器,包括使用其头文件并使用其库调用 Microsoft 链接器。

    此外,我不知道使用 clang++ 的原因在 Windows 上没有同时指定 -target (下一节)。无 -target , clang++仍然使用 MSVC 头文件、库和链接器,但不传递模拟 cl.exe 所需的开关。编译器。我怀疑这总是会导致可执行文件的目标代码不匹配。

    还有其他方法可以不接收这些警告吗?

    就我而言,我希望 Clang 模拟 MinGW gcc编译器并改为调用其链接器。为此,按照 this answer , 添加 -target x86_64-pc-windows-gnuclang++命令行:
      $ clang++.exe -target x86_64-pc-windows-gnu -o cpphello.exe cpphello.cpp

    该命令不会产生任何警告,并且是一个可以运行的可执行文件。

    通过添加 -v到该命令行,您可以看到详细信息,包括调用 MinGW ld.exe链接器。

    注意:您需要一个 MinGW gcc在您的 PATH !

    铿锵与铿++呢?

    喜欢 gcc , clang如果文件使用它识别的扩展名,则将编译 C++ 代码,例如 .cc.cpp .但是,它不会将 C++ 标准库传递给链接器,即使您在单个命令中编译和链接也是如此。因此,一般最好使用 clang++仅在使用 C++ 代码时。

    同样, clang -x c++可用于编译 C++,但同样不会将 C++ 标准库传递给链接器。

    关于c++ - Windows clang Hello World lnk4217,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50274547/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com