我刚刚安装了Qt Creator并使用了C++ 11语法.
不幸的是,当我尝试构建我的项目时,我得到:
/usr/include/c++/4.8/bits/c++0x_warning.h:32: error:
#error This file requires compiler and library support for the ISO C++ 2011
standard. This support is currently experimental, and must be
enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support for the \
^
Run Code Online (Sandbox Code Playgroud)
然后是一堆错误,比如" tuple不是一个成员std".
我的CMakeLists.txt包含:
project(routing_tests)
set(QMAKE_CXXFLAGS "-std=c++11")
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
Run Code Online (Sandbox Code Playgroud)
编辑:显示问题的微小测试用例https://gist.github.com/anonymous/8171073
与Java不同,在C/C++中允许使用以下内容:
int* foo ()
{
if(x)
return p;
// what if control reaches here
}
Run Code Online (Sandbox Code Playgroud)
这通常会导致崩溃并且难以调试问题.为什么标准不强制要求非函数的最终回报void?(编译器生成错误return值的错误)
gcc/msvc中是否有任何标志来强制执行此操作?(像-Wunused-result)
为什么不推荐使用/Wp64 Visual C++中的标志?
cl:命令行警告D9035:
已弃用选项'Wp64',将来的版本中将删除该选项
我有一个使用bitbake的OpenEmbedded环境来做一些构建.我希望得到一些"交互式"的东西,bitbake会暂停并询问输入然后继续构建,但我发现这是不可能的.
因为我不能这样做,所以我正在寻找一些方法来为构建传递额外的标志.有没有办法将标志传递给bitbake构建类似gcc的-D选项?
即:
bitbake -Dfoo=bar oe-myimage
Run Code Online (Sandbox Code Playgroud)
因此在oe-myimage变量的构建过程foo中将设置为bar.
build compiler-flags command-line-arguments openembedded bitbake
我从"学习你是一个伟大的好的哈斯克尔"的第9章中学到了这一点
按照惯例,我们通常不会为其指定类型声明
main.
据我所知,这个惯例很普遍.但是,如果我使用-Wall标志编译一个缺少类型签名的程序main,例如
-- test.hs
-- main :: IO ()
main = print (1 :: Int)
Run Code Online (Sandbox Code Playgroud)
GHC确实发出警告:
$ ghc -Wall test.hs
[1 of 1] Compiling Main ( test.hs, test.o )
test.hs:2:1: Warning:
Top-level binding with no type signature: main :: IO ()
Linking test ...
$
Run Code Online (Sandbox Code Playgroud)
我很困惑......如果类型签名main确实是多余的,为什么-WallGHC会在它丢失时抱怨?是否有充分的理由(除了摆脱那个警告)指定main的类型?
haskell program-entry-point conventions compiler-flags type-signature
我正在使用CMake进行两个版本的项目,其中一个需要-lglapi而另一个则不需要.
到目前为止,我们使用的线条看起来像这样:
SET(CMAKE_C_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
SET(CMAKE_CXX_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
Run Code Online (Sandbox Code Playgroud)
我在我的CMakeList.txt中添加了一个if语句,紧跟在这些行之后:
if(SINGLE_MODE)
SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " -lglapi")
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -lglapi")
endif(SINGLE_MODE)
Run Code Online (Sandbox Code Playgroud)
SINGLE_MODE变量定义了一点点.当我使用message命令显示标志变量的内容时,它看起来没问题:
-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm -lglapi
Run Code Online (Sandbox Code Playgroud)
但是当我开始编译时,我遇到了编译错误.使用详细模式我意识到在编译器调用中看起来像:
-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm; -lglapi
Run Code Online (Sandbox Code Playgroud)
也就是说,在将-lglapi添加到列表之前添加了分号.
这里有没有人遇到类似的问题,并知道解决这个问题的方法?我用谷歌搜索了很长一段时间并研究了CMake手册,但看不出我在这里做错了什么.
谢谢,托比亚斯
具体来说,我想知道GCC有什么保证关于在使用编译的代码链接时抛出异常行为的代码的方式-fno-exceptions.
GNU libstdc++手册在此处说明如下.
在详细说明库支持之前
-fno-exceptions,首先要记下使用此标志时丢失的内容:它将破坏尝试传递代码的异常,-fno-exceptions无论代码是否具有任何构造try或catch构造.如果您可能有一些抛出的代码,则不应使用-fno-exceptions.如果您有一些使用try或的代码,则catch不应使用-fno-exceptions.
这听起来像是一句话,"你不应该......"即未定义的行为.
在另一方面,我从感觉这太问题是,一切都是犹太只要用编译的代码-fno-exceptions不会throw,try或catch(显然是一个编译时错误)和异常从来没有经历过这个库的函数传播.它是有道理的:为什么-fno-exceptions如果异常被抛出只要它们不与它的函数交互,那么库是否应该小心编译?
我做了一点修改,发现如果我使用GCC 7.1.1编译一个简单的程序,其中一个源文件被编译-fno-exceptions而另一个抛出并捕获异常,所有内容都编译,链接和运行正常.但这并不意味着这种行为得到保证; 它仍然可能是未定义的.
我所有这一切的动机是我有一种情况,我将我自己的应用程序代码链接到一个用-fno-exceptions它构建的库,并且根据对所述库进行的函数调用,在我自己的代码中抛出一个异常导致立即即使异常没有通过库的函数传播,也会发生段错误.它对我来说闻起来像库中的一个错误,但我想也许-fno-exceptions在编译过程中这是允许的.
GCC 对代码生成标志的实际参考提到了-fexceptions相对简短,并没有回答我的问题.有谁知道另一个参考/有相关经验?
更新:我从源代码重建了库,这次启用了异常支持.段错仍然存在!错误报告的时间.
如何让gcc在第一次错误后不停止编译.是否有编译器标志可以执行此操作?
基本上我想要删除一个类,但我不确定会产生多大的影响,所以我想确定有多少类会有问题,如果我说,从makefile中删除该类.
有没有更好的方法来确定这种影响?
使用GCC,可以打印出-march=native触发的特定标志.是否有可能让Clang打印类似的信息?
编辑:感谢@NateEldredge,我在如何在 C 源文件中“标记”位置以供以后断点定义中更好地定义了我的问题?
我使用这些标签在 gdb 中设置断点。因此,无论我在标签之后/之前添加/删除代码行,断点仍然是正确的。
如果我添加-Wno-error=unused-label到编译选项,编译器不会对我大喊大叫,但标签会从程序集中消失。
相反,如果我__attribute__((unused))在代码中使用,结果是相同的:没有抱怨,但标签消失了。
有没有正确的方法来完成这个任务(而不仅仅是黑客)?
这是我的玩具示例:
int main(void){
int a = 15;
label: __attribute__((unused))
a = a + 23;
return a;
}
Run Code Online (Sandbox Code Playgroud)
编译后结果为:
main:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 15
add DWORD PTR [ebp-4], 23
mov eax, DWORD PTR [ebp-4]
leave
ret
Run Code Online (Sandbox Code Playgroud)
这是同一示例的交互式版本: https: //godbolt.org/z/zTqd9bM6q
int main(void){
int a = 15;
label: __attribute__((unused))
a = a + 23;
return a;
}
Run Code Online (Sandbox Code Playgroud) compiler-flags ×10
c++ ×4
c ×3
gcc ×3
cmake ×2
assembly ×1
bitbake ×1
build ×1
c++11 ×1
clang ×1
conventions ×1
deprecated ×1
exception ×1
haskell ×1
linker-flags ×1
openembedded ×1
qt ×1
return-value ×1
visual-c++ ×1