草庐IT

c++ - GCC 默认导出所有符号与 MSVC 默认不导出任何内容之间的设计原理是什么?

C++编译器GCC和MSVC之间的许多关键区别之一是,首先默认导出共享库中的所有符号,而MSVC不导出任何内容。一些含义是,在MSVC中,您必须导出显式实例化的模板类。虽然我已经接受了这一事实,但我想知道从编译器设计人员的角度来看,每种方法的设计含义、权衡是什么? 最佳答案 这可能与各自操作系统中的可执行文件和库有关。在Windows上,库(DLL)和可执行文件是一回事。从字面上看,您可以将.dll重命名为.exe,它将运行保护模式stub并输出一些错误(再次强调,保护模式,因此它只能在16位系统上运行)。鉴于它们是相同的,并且您可

c++ - 如何告诉 clang 将调试符号放入可执行二进制文件中?

这个问题在这里已经有了答案:Whydoesa2-stagecommand-linebuildwithclangnotgenerateadSYMdirectory?(1个回答)关闭5年前。我的编译命令在macOSSierra中是clang-std=c11-g-Wall-Werror-fsanitize=address-file.c-ofile编译后,它还会生成一个额外的file.dSYM文件,其中包含所有调试符号。但是,当我使用WSL或其他*nix系统时,它不会生成这样的文件,调试符号被嵌入到可执行二进制文件中。所以我只是想知道有没有办法在macOS中使用clang做同样的事情。

c++ - 使用LLVM的libc++时__1符号从何而来?

我看到很多问题,例如AppleMach-OLinker(Id)Error和UndefinedsymbolsincryptoppatIOS64-bitproject.问题通常被描述为:Undefinedsymbolsforarchitecturei386:"std::__1::basic_ostream>::flush()",referencedfrom:cv::gpu::error(charconst*,charconst*,int,charconst*)inopencv2(gpumat.o)问题通常归结为混合/匹配-stdlib=libc++(LLVMC++运行时)和-stdlib=

c++ - SFINAE 在函数前加符号与其名称

下面的代码正确地检查类型T是否有方法sort。但是,当我通过将decltype(&U::sort,...)更改为decltype(U::sort,...)(符号&被移除),则代码始终返回false。为什么?为什么名字本身就不够用?&是什么意思?#include#includetemplateclasshas_sort{templatestaticautocheck(bool)->decltype(&U::sort,std::true_type());//(*)templatestaticstd::false_typecheck(...);public:usingtype=decltyp

c++ - 转换为无符号时,标准表示结果为 "the least unsigned integer"。为什么 "least"在这里很重要?

C++标准在[conv.integral/2]中说,关于整数转换为无符号:Ifthedestinationtypeisunsigned,theresultingvalueistheleastunsignedintegercongruenttothesourceinteger(modulo2nwherenisthenumberofbitsusedtorepresenttheunsignedtype).我的问题是,为什么会有“最少”这个词?有没有可能有多个结果,我们需要从中选择一个? 最佳答案 有无限多个整数等于任何值k模2n。有k,k

c++ - 在 C++ 预处理器中组合两个#defined 符号

我想做的事:#defineVERSIONXY123#definePRODUCTMyApplication_VERSION因此PRODUCT实际上是MyApplication_XY123。我试过使用合并运算符##但收效有限......#defineVERSIONXY123#definePRODUCTMyApplication_##VERSION=>我的应用程序版本#defineVERSIONXY123#definePRODUCTMyApplication_##(VERSION)=>MyApplication_(XY123)-关闭但不完全我想要的是可能的吗? 最

c++ - 如何设置 Windows 符号服务器

我在网络上有一个备用服务器,我想用它来托管我们所有的构建符号。我已经知道如何在我的本地开发系统上设置符号缓存并将我的调试器(例如Windbg)指向“符号文件路径”中的该路径。我假设我可以对网络上具有自己的符号缓存(例如\\host\symbols)的另一个系统执行相同的操作。我设置了服务器并在目录上启用了文件共享,因此我可以通过Windows资源管理器远程访问它。然而,当我尝试在WinDbg中指向它时,它似乎并没有在那里拾取符号。符号文件路径设置如下:srv*\\192.168.1.20\symbolpath*http://msdl.microsoft.com/download/sym

c++ - 摆脱有符号和无符号整数表达式之间比较的优雅方法

我有以下模板:一个用于未签名,另一个用于签名。有什么优雅的方法可以在不抑制编译器警告的情况下消除它吗?warning:comparisonbetweensignedandunsignedintegerexpressions我是否需要为每种类型编写函数,例如uint8、uint16等等?template::value,bool>::type=true>voiddebugValidateParameter(XaValueToCheck,YaLowerLimit,ZaUpperLimit){if((aValueToCheck>aUpperLimit)||(aValueToCheck::val

c++ - Xcode C++::架构 x86_64 的重复符号

我是Xcode的新手,当我构建以下代码(MWE)时,出现以下错误ld:3duplicatesymbolsforarchitecturex86_64clang:error:linkercommandfailedwithexitcode1(use-vtoseeinvocation)我有如下三个文件;main.cpp#include"B.cpp"intmain(){square(5);return0;}B.cpp#include"A.cpp"voidsquare(intn){display(n*n);}A.cpp#includeusingnamespacestd;voiddisplay(in

c++ - 将 -1 转换为无符号类型

考虑以下代码来设置x的所有位unsignedintx=-1;这是可移植的吗?它似乎至少适用于VisualStudio2005-2010 最佳答案 引用较多的答案:我知道这里有很多正确答案,但我想添加一些引用。我将引用两个标准:C99n1256草案(免费提供)和C++n1905草案(也免费提供)。这些特定标准没有什么特别之处,它们都是免费提供的,而且是目前最容易找到的任何东西。C++版本:§5.3.2¶9:根据本段,值~(type)0保证设置所有位,如果(type)是一个无符号类型。Theoperandof~shallhaveinte