问题标签 [g++4.8]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++11 - 进入函数调用堆栈时,此指针设置为 null - 发生在 gdb 下的 Google Test
我写了一些代码并对其进行了一些(谷歌)测试,却发现它失败了:程序完成并给出了错误的输出。所以我很自然地启动了 gdb 并尝试调试我的测试。
有趣的是,就在我进入 GetCandidates(int cursor) 函数之前,在第 102 行,“this”指针很好:
然后我在函数中做了一个“步骤”,它立即给了我一个异常,抱怨“this”为空(this=0x0):
这有多荒谬?我确定这仅在我通过使用 Google Test 编写的测试用例进行调试时发生,而不是在我运行它们时发生:
如您所见,当我运行 Google 测试时,产生了不正确的输出 12。尽管程序未能通过断言,但它毫无例外地完成了。
您可能感兴趣的一些信息:
1,我的程序中只有一个线程,尽管 Google Test 使用 pthreads 来并行执行测试,根据他们的文档(它说不能保证某些测试在其他测试之前完成)。
不确定这与我的情况是否相关,因为我的每个测试都有自己的对象,并且没有通用的设置/拆卸部分,因此一个测试中的对象不太可能被另一个测试破坏。他们看起来像:
2、平台:CYGWIN_NT-6.1;g++ 用于编译谷歌测试和这个程序:4.8.3(是的,我遵循谷歌测试的文档并使用与我的 c++ 程序相同版本的编译器从源代码编译以避免潜在问题);gdb 版本:7.8
提前感谢您的投入!
c++ - 设置 LD_LIBRARY_PATH 会导致与现有程序发生冲突
我很难编译以下示例代码:
假设使用引擎接口调用Matlab
函数。使用以下编译器选项编译它:
给出一千条错误消息=>链接
在互联网和这个论坛上阅读和搜索后,我发现以下答案#1、#2、#3很有帮助,我可以编译相同的程序,只需将LD_LIBRARY_PATH
我的系统设置如下:
但是另一个共享相同变量(ROS)的程序不再工作,我收到以下错误消息:
所以我必须重新设置环境变量并再次注销才能使用 ROS。
所以在我看来,Matlab 和 ROS 实际上并没有看到和识别它们在那个环境变量中的路径。使用其中一种会排除另一种的资源。它们如何在同一个系统中共存?我应该如何设置这个变量?
更新#1: 根据迈克尔的建议,我尝试了以下 shell 命令:
它编译!:) 所以对迈克尔投了赞成票。
但问题仍然存在:如果我尝试运行该程序,我会收到以下错误消息:
那是因为库是共享的,应该在运行时找到。任何想法???
问候
r - 自定义 R 在哪里查找共享对象?
这个问题与之前关于 RcppArmadillo 的问题类似。
一些快速的上下文:
我目前必须在 CentOS 5 系统上工作。当然,CentOS 5 自带的编译器太旧了,所以我们安装了 gcc-4.8.3。现在,其他人担心与旧编译器的向后兼容性,因此新的 gcc 被放置在opt
目录中。为了使用升级后的 g++,我必须LD_LIBRARY_PATH
在 R 中设置Sys.setenv
现在,我还需要安装 RcppArmadillo 的存档版本。我从CRAN获取存档包并安装:
这似乎没有问题,但是当我尝试加载库时,出现以下错误:
从我的理解来看libstdc++.so
,找到的文件太旧了,即不是opt
目录中较新的文件。我认为这可以通过LD_LIBRARY_PATH
上面的设置来解决,但它似乎仍在寻找/usr/lib64/
。我有什么办法让 R 在这个其他目录中查看以获取适当的so
文件?当然,如果我做了一些会导致这种情况的奇怪事情,我对其他解决方案持开放态度(除了覆盖旧的 gcc 版本)。
编辑
我还注意到在安装时-shared
再次显示usr/
路径而不是opt/
路径。这就是我要更新的内容,因此 R 也会搜索该opt
目录。
更新
我还尝试通过设置在opt
目录中创建Makevars
文件来手动附加目录,其中. 编译期间的行如下所示:.R
PKG_LIBS += -L$(OPT_PATH)
OPT_PATH = /opt/gcc-4.8.3/rtf/lib64
shared
但我仍然得到同样的错误:
更奇怪(至少对我而言)是运行ldd
表明RcppArmadillo.so
文件指向正确的文件。
其中确实包含GLIBCXX_3.4.9
c++ - 嵌套模板的类外定义的模板和类型名关键字:VS 2012 和 g++ 4.8.1 显然不同意
我目前正在尝试按照Dr.Dobb概述的方法为自定义模板化容器类实现迭代器。在我尝试为嵌套的迭代器定义迭代器成员函数之前,它工作正常
像这样的课外:
到目前为止,我已经能够识别出三种不同的变体(下文详述),它们适用于 g++ 4.8.1(使用 C++0x)或 Visual Studio 2012(更新 4),但不适用于两者同时。
这样做的正确方法是什么?
从 2009 年开始似乎有一个相关的问题,但据我所知,它不包含Variant 4,我认为编译器错误现在已经修复。;)
还有这个问题,让我觉得Variant 3应该是那个,g++接受Variant 1是一种礼貌。
我在底部包含了完整的精简测试应用程序;它应该按照提供的方式编译(注释适当的行)。
变体 1:没有关键字
对于这个变体,VS 抱怨依赖名称不是类型并建议使用typename关键字:
变体 2:只有typename关键字
如果只使用typename关键字(正如 VS 对 Variant 1 的建议),g++ 对此不太满意:
变体 3:两个关键字
如果使用了两个关键字(如 g++ 对变体 2 的建议),VS 再次抱怨:
完整的测试应用程序
由于auto关键字,需要-std=c++0x和 g++。
c++11 - 同时创建的对象 - 不需要的编译器优化?
我有一个奇怪的问题:
给出以下对象
(gdb) print pre $1 = std::vector of length 20, capacity 32 = {{timePoint_ = {__d = {__r = 1427724945979761000}}}, { timePoint_ = {__d = {__r = 1427724945979761000}}}, {timePoint_ = {__d = { __r = 1427724945979761000}}},{timePoint_ = {__d = {__r = 1427724945979761000}}},{ timePoint_ = {__d = {__r = 1427724945979761000}}},{timePoint_ = {__d = {__d = {__d = {__r = 14207749597) }},{timePoint_ = {__d = {__r = 1427724945979761000}}},{ timePoint_ = {__d = {__r = 1427724945979761000}}},{timePoint_ = {__d = { __r = 1427724945979761000}}},{timePoint_ = {__d = {__r = 1427724945979761000}}},{ timePoint_ = {__d = {__r = 1427724945979761000}}},{timePoint_ = {__d = { __r = 1427724945979761000}}},{timePoint_ = {__d = {__r = 1427720}}1427720}14277204 ,{timePoint_ = {__d = {__r = 1427724945979761000}}},{timePoint_ = {__d = { __r = 1427724945979761000}}},{timePoint_ = {__d = {__r = 1427724945979761000}}},{ timePoint_ = {__d = {__r = 1427724945979761000}}},{timePoint_ = {__d = { __r = 1427724945979761000}}},{timePoint_ = {__d = {__r = 1427724945979761000}}},{ timePoint_ = {__d = {__r = 14270724}}}}59977
1、理论上,20 个 UserType 对象中的每一个都应该有不同且唯一的 time_since_epoch().count(),但在 gdb 输出中,它们都是相同的。
2,我在这里尝试了相同的代码:http: //melpon.org/wandbox并且每个对象都有一个唯一的时间戳。所以我正在观察不同的行为。
3、一些分析:pre.push_back(UserType())中的UserType();是一个右值;然后编译器将值复制(通过复制构造函数)右值到向量 pre 中的左值对象中。编译器是否有可能看到常量循环号 20 和右值对象指令,因此决定“同时”创建 20 个对象作为优化?即使是这种情况,编译器也不太可能同时进行构造——不存在同时进行的事情——只有可以忽略的微小差异。我不认为编译器可以在 stable_clock 的 1 个刻度内完成 20 个对象构造。
4,这是我的 Makefile 中的相关编译标志 - 请注意,我没有要求编译器进行优化:-g -Wall -std=gnu++0x
5,这段代码(20个对象构造的循环)在google测试文件中;我的编译器是 cygwin 上的 g++ 4.8.3。
我的问题是:
这里发生了什么?具体来说,为什么我看到构建 20 个对象的相同时间戳?
非常感谢。
/*******************根据请求,UserType实现*********************/
c++ - 模板类不识别模板参数
我正在尝试编译以下代码。但是,由于某种原因,编译失败。有很多错误,但都与模板中的TYPE有关。
我检查了代码,它看起来像。我看不到问题。这可能是一个愚蠢的错误,但不要看到。任何人都可以帮忙吗?
头文件:
这是cpp文件:
输出:
c++ - 为什么字符串文字比较是 C++ 中实现定义的行为?
我在 The C++ Programming Language special 3rd edition 中阅读了以下内容:
是否将两个相同的字符文字分配为一个是实现定义的(§C.1)。
请注意, == 在应用于指针时比较地址(指针值),而不是指向的值。
我在 gcc 4.8.1 和 MSVS 2010 上尝试过以下程序
输出:
美好的!!!(在 gcc 4.8.1 上)
!fine(在 MSVS 2010 上)
为什么将其保留为实现定义的行为?是什么原因?
c++ - 变量在调用 lambda 之前被销毁
我正在尝试构建一个包含一些输入函数和一些前/后操作的 lambda。
- 如果我尝试包装常规函数/lambda,我的代码可以正常工作,并且可以正确调用前/后操作。
- 但是,当我尝试将装饰 lambda 应用于它之前生成的函数时,我的程序在抱怨内部函数在某个时候被释放后崩溃(这已由 valgrind 确认)。
Xcode 6 clang
令我困惑的是,崩溃取决于编译器:代码在( based)下工作得很好clang-3.6
,但在 linux 上使用clang++-3.6
and崩溃g++4.8.4
。
我制作了一个重现行为的小程序:
我在变量范围管理中做错了什么?该程序是否有任何理由不使用 Apple 的 LLVM 崩溃?
编辑
作为记录,这里是TClambdaFactory
建议更正后的正确:
c++ - 为什么我可以从 {} 初始化常规数组,而不是 std::array
这有效:
的所有元素的arr
值初始化为零。
为什么这不起作用:
我从 g++(4.8.2 版)收到以下警告:
警告:成员 'std::array<int, 10ul>::_M_elems'</p> 缺少初始化程序