编辑:感谢@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) 关于编译器(GCC)所做的优化,标准做法是什么?每个选项(-O,-O1,-O2,-O3,-Os,-s,-fexpensive-optimizations)的作用有何不同,我如何确定最佳选项?
在Xcode 5之前,可以NSAssert使用默认的构建设置阻止发布版本包含语句及其变体:
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
Run Code Online (Sandbox Code Playgroud)
此设置可project.pbxproj在此处找到并在Xcode中设置:

(请注意,此抓取是从转换为Xcode 5的Xcode 4项目中获取的.)
每个目标只在Release版本中继承此设置.显然这是一件好事.该应用程序可能无论如何都会挣扎,而不是立即崩溃.而对于Debug版本,您希望在NSAssert失败时立即知道.
但是,我很难找到Xcode 5中的等价物.
使用默认模板创建新项目不会显示等效设置:

我的问题是,Xcode 5中的等效设置是什么,还是NS_BLOCK_ASSERTIONS必须手动添加到Other C FlagsRelease版本中?
我目前正在使用CMake创建一堆Visual Studio 2013项目,它的工作原理.但是,自动创建的ZERO_CHECK和ALL_BUILD项目默认设置为使用MBCS,尽管我希望它们使用Unicode字符集.
我确实为我的项目指定了Unicode字符集的使用,具体如下:
ADD_DEFINITIONS(-DUNICODE)
ADD_DEFINITIONS(-D_UNICODE)
Run Code Online (Sandbox Code Playgroud)
它起作用了.我尝试用以下内容设置c ++编译器标志:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /UMBCS /D_UNICODE /DUNICODE")
Run Code Online (Sandbox Code Playgroud)
甚至 :
ADD_DEFINITIONS(-DUNICODE)
ADD_DEFINITIONS(-D_UNICODE)
Run Code Online (Sandbox Code Playgroud)
在我的项目设置之前,但它根本不影响ZERO_CHECK和ALL_BUILD.有任何想法吗 ?
当我安装vector时:
cabal install vector
Run Code Online (Sandbox Code Playgroud)
我得到了很多SpecConstr限制警告,如果我可以指定,它会消失-fspec-constr-count=SOMETHING-HIGHER.
将
cabal install vector -fspec-constr-count=HIGH
Run Code Online (Sandbox Code Playgroud)
工作?
如果X依赖vector,是否有一种方式可以说X.cabal我vector最好依赖(如果X还没有安装)-fpsec-constr-count=HIGH?
是vector仍然保持还是有现在一个更值得推荐的选择吗?
可能是一个简单的答案; 对于其中一些标志,我对GCC文档中使用的语言感到很困惑!
无论如何,我有三个库和一个使用这三个的程序.我用各个(可能)不同的警告标志集分别编译我的每个库.但是,我使用相同的优化标志集编译所有三个库.
然后我编译我的主程序链接在这三个库中,它们有自己的一组警告标志和库编译时使用的相同优化标志.
1)我是否必须使用优化标志编译库,或者我可以在编译最终程序并链接到库时使用这些标志?如果是后者,那么它会优化这些库中的所有代码还是仅仅代表某些代码(可能是所谓的代码)?
2)我想使用-fwhole-program -flto -fuse-linker-plugin和链接器插件gold.我在哪个阶段编译这些......只是最后的编译或者在编译库时是否需要存在这些标志?
3)与2)几乎相同,但是-fprofile-generate -fprofile-arcs和-fprofile-use.我理解首先运行一个带有generate的程序,然后使用.但是,我是否必须使用generate/use等编译每个库或仅使用最终程序?如果它只是最后一个程序,那么当我使用-fprofile-use进行编译时,它是否还会优化库功能?
我需要在命令行上编译Java程序,我试图将编译器级别设置为较低的(1.6).我试过这样但是没有用:
javac -1.6 Hello.java
Run Code Online (Sandbox Code Playgroud) 我正在编译第三方库,并不关心修复库中存在的警告,但我不希望它们污染Qt Creator中的" 问题"窗格.
我已经尝试过遵循这里的建议,但是-Wall在启用后没有编译器标志可以禁用,例如-Wno-enum-compare.
看完这个,我试图消除标志,如下所示:
CFLAGS -= -Wall
Run Code Online (Sandbox Code Playgroud)
但这也不起作用.所以我尝试了这个建议:
QMAKE_CXXFLAGS_WARN_OFF -= -Wall
Run Code Online (Sandbox Code Playgroud)
依然没有.
所以我查看了生成Makefile并发现了这个:
CFLAGS = -pipe -g -fPIC -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS = -pipe -g -fPIC -Wall -W -D_REENTRANT $(DEFINES)
Run Code Online (Sandbox Code Playgroud)
所以我尝试从这两个变量中删除标志:
CFLAGS -= -Wall
CXXFLAGS -= -Wall
Run Code Online (Sandbox Code Playgroud)
依然没有.你打算如何删除这个编译器标志?!
我正在试图弄清楚如何-march正确设置选项,以查看使用gcc 4.7.2在我的电脑上启用和禁用选项之间的性能差异.
在尝试编译之前,我试图找到什么是-march我的电脑的最佳选择.我的电脑有Pentium G850,其架构是Sandy Bridge.所以我提到了gcc 4.7.2手册,发现它-march=corei7-avx似乎是最好的.
但是,我记得基于Sandy Bridge的Pentium缺乏AVX和AES-NI指令集支持,Pentium G850也是如此.所以-march=corei7-avx不是一个合适的选择.
我想出了一些潜在的选择:
-march=corei7-avx -mno-avx -mno-aes-march=corei7 -mtune=corei7-avx-march=native考虑到我的信息,第一个选项看起来很合理,但我担心除了AVX和AES-NI之外可能缺少其他功能.第二种选择看起来很安全,但由于它可能会错过Sandy Bridge上的一些小功能-march=corei7.第三个选项将解决我的所有问题,但我听说这个选项有时会误检测CPU的功能,所以我想知道如何手动执行此操作.
我用Google搜索并搜索了StackOverflow和SuperUser,但我找不到任何明确的解决方案......
应该设置哪些选项?
如果我有一个受Intel jcc erratum约束的芯片,我如何在 gcc 中启用缓解(它调整分支位置以避免有问题的对齐),以及哪些 gcc 版本支持它?