是否有任何方法可以重写: flag llvm description: compile via LLVM default : if os(mingw32) False else True 或 flag llvm description: compile via LLVM default : True if os(mingw32) ?SET-LLVM=False? 并获得cabal与之合作? 注意: 在同一文件中进一步向下使用llvm标志,例如: if flag(llvm) ghc-options: -fllvm -optlo-O3 ,还有许多其他单一的高级标志可以转化为多个ghc-options条目,例如static to -static -optl-static. . 解决方
以下是关于 compiler-flags 的编程技术问答
我对快速覆盖-werror flag的响应有点困惑吗? 所以我在这里问我的具体问题. 我有多个makefiles一起工作,并且已经设置了cflags(-werror -wall ..和许多其他) 但是,在其中一个makefiles中,我希望这些错误不会被视为警告,所以我想删除-werror标志. 实现这一目标的最佳方法是什么,因此仅对于此Makefile,-werror标志被删除,而对于其他正常执行才会发生? 谢谢 晴天 解决方案 更简单的方式 看起来您可以调用 gcc -c ... -Werror ... -Wno-error ... 没有GCC抱怨(GCC 4.7.1).因此,您可以在需要它的一个makefile中其他地方设置的CFLAG添加-Wno-error.如果您使用的是gnu make,则可以添加: CFLAGS += -Wno-error 可能仅适用于需要它的单个目标. 难以 否则,您需要一个从组件
我只是从Linux上的G ++编译器开始,并在编译器标志上有一些问题.这是他们 优化 我在G ++手动页面中阅读了有关优化标志-O1,-O2和-O3.我不明白什么时候使用这些标志.通常,您使用什么优化级别? G ++手册说的以下内容-O2. 优化更多. GCC几乎执行所有不涉及太空折衷方案的支持优化.当您指定-O2时,编译器不会执行循环展开或功能内部.与-o相比,此选项增加了汇编时间和生成代码的性能. 如果它不进行内部和循环展开,则如何实现上述性能?是否建议使用此选项? 静态库 如何使用G ++创建静态库?在Visual Studio中,我可以选择一个类库项目,并将其编译到" LIB"文件中. G ++的等效是什么? 解决方案 经验法则: 当您需要调试时,使用-O0(和-g生成调试符号.) 准备运送它时,请使用-O2. 使用Gentoo时,使用-O3 ...! 当您需要将其放在嵌入式系统上时,请使用-os(优化尺寸,而不
运行gcc使用Optimizations-on运行时,当它考虑该函数在热路径中或有常数传播到函数参数时. 更具体地说,这似乎由fipa-cp-clone选项控制. 有什么方法可以影响这一点吗?例如,将一个参数标记为具有某些属性的一个参数,为编译时常数(就像您在模板参数中可以在C ++中执行的那样),它将导致函数克隆? 解决方案 重要的是是否使用常数参数调用该函数(实际常数表达式,还是通过常数传播确定为恒定的东西).在这种情况下,GCC将克隆该功能,除非它确定这样做的成本太高或受益太小.我不知道一种影响该指标的方法.请注意,恒定传播仅在单个翻译单元(源文件)中发生,除非您一次单击整理整个程序或使用链接时间优化,否则我不确定克隆是否仍会在此时发生. 我最好的猜测,如果您期望应该在克隆时不会发生克隆,那就是GCC永远不会看到调用函数的恒定参数.即使您知道这是恒定的,编译器也可能无法证明它是.
我正在使用C执行矩阵操作.手工优化的代码,我只想使用编译器标志更快地使本机代码更快,并了解有关这些标志的更多信息. 我到目前为止发现的标志可以改善矩阵代码. -O3/O4 -funroll-loops -ffast-math 解决方案 首先,由于以下原因,我不建议使用-ffast-math: 已经证明,当降级 在大多数(如果不是全部)情况下使用此选项.所以"快速数学" 是 实际上不是那么快. 此选项破坏了对浮点的严格遵守 最终导致计算积累的操作 性质不可预测的错误. 您可能会在不同的环境中获得不同的结果,并且差异可能是 重大的.术语环境(在这种情况下)意味着:硬件的组合 OS,编译器.这意味着当您获得意外的情况的多样性 结果具有指数增长. 另一个可悲的结果是与 使用此选项构建的库可能 期望正确(符合IEEE)浮点数数学,这是 他们的期望破裂的地方,但很难弄清楚 为什么为什么. 最后,看看 a>. 出于相同的原因,您应该避免-Ofast
我希望您输入哪个GCC编译器标志在优化Xeons时使用? MTUNE或3月没有" Xeon",那么最接近的匹配是? 解决方案 Xeon是一个营销术语,因此它涵盖了一长串具有不同内部设备的处理器. 如果您是指更新的Nehalem处理器(核心i7),则此幻灯片表明,截至4.3.1 GCC应使用-March = generic(尽管您自己的应用程序可能会找到其他测试设置优于此). 4.3系列还添加了-msse4.2,如果您希望优化FP数学的那个方面. 这是其他解决方案 最近的GCC/Xeon的更新. 基于sandy-bridge xeon (e3) -12XX系列,E5-14XX/24XX系列,E5-16XX/26XX/46XX系列). -march=corei7-avx对于GCC -march=sandybridge gcc> = 4.9.0. 这启用高级矢量扩展支持 https://en.wikipedia.org/wiki/clmul_ins
我从各种来源(尽管主要是从我的同事那里听到的),在G ++中以-O3的优化水平以某种方式是"危险的",除非有必要证明是必要的. 这是真的,如果是,为什么?我应该只是坚持-O2? 解决方案 在GCC(2.8等)和EGC时期的早期,Redhat 2.96 -O3有时很大.但这是十多年前,-O3与其他优化级别没有太大不同. 然而,它确实倾向于揭示人们依赖不确定行为的情况,因为更严格地依赖规则,尤其是角落案例,语言. 作为个人注释,我在金融领域运行了多年的生产软件已有-O3,并且尚未遇到一个错误,如果我使用-O2. . 根据大众需求,这里是一个补充: -O3,特别是其他标志,例如-funroll -loops(未由-O3启用)有时会导致生成更多的机器代码.在某些情况下(例如,在具有非常小的L1指令缓存的CPU上),这可能会导致所有的守则,例如现在有些内部循环不再适合L1i.通常,GCC很难不生成那么多代码,但是由于通常会优化通用情况,因此可能会发生这种情况.通
在makefile中定义了以下内容: CXX = g++ CXXFLAGS = -std=c++11 我想在不更改原始makefile(完美运行)的情况下将代码编译为OpenMP指令.该手册提出了一种方法,就是在命令行上更改它.但是,当我跑步时, make CXXFLAGS=-std=c++11 -fopenmp 上面提到的错误弹出.有人可以帮我理解我在做错什么吗? 解决方案 这里的问题是-std=c++11和-fopenmp之间的空间.它将这两个参数划分为上,-fopenmp被解释为选项-f然后openmp被解释为makefile make make试图构建,因为它在当前目录中找不到. 您需要用引号(")执行make $ make CXXFLAGS="-std=c++11 -fopenmp" 这将把CXXFLAGS= -std=c++11 -fopenmp传递到make.我们可以通过以下简单makefile. 看到这种行为 CXX = g+
我目前正在学习opencl.现在,当我想编译程序时,我会在此命令中遇到错误: g++ -Wall -l OpenCL main.cpp -o main 错误主要是不确定的引用,因为库未链接,我认为(尽管如此,我将在最后发布错误代码). 但是,使用此命令一切正常: g++ -Wall main.cpp -o main -l OpenCL 所以我的问题是,在命令前使用-L标志我该怎么办? (背景是:我想使用netbeans编译我的程序,当我在 - > properties-> build-> build-> c ++编译器 - >附加选项下添加标志时,它将放入该位置,在第一个命令中显示) 事先感谢您的帮助 这是错误代码: /tmp/ccmKP4oI.o: In function `cl::detail::ReferenceHandler::release(_cl_context*)': main.cpp:(.text._
我正在尝试使用node-gyp来构建node.js c ++ addon.node. 我尝试设置我的binding.gyp这样: "libraries": [ "-L../../install_release_x64/", "-llibppp" ], "ldflags": [ "-Wl,-rpath,'$ORIGIN'" ], "cflags_cc": [ "-fexceptions", "-fPIC", "-Wno-unknown-pragmas" ] 但是当我运行$ readelf -d addon.node时,结果就是这样: Dynamic section at offset 0x7d10 contains 29 entries: Tag Type
我看到python构建C扩展时重复的一些gcc标志.当我运行时: python setup.py build_ext 运行构建命令看起来像这样: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fstack-protector-strong -fno-plt -flto=4 -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -march=x86-64 -mtune=generic -O3 -pipe -fstack-protector-strong -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fstack-protector-strong -fno-plt -fPIC
编辑:感谢@nateeldredge,我最好在如何将C源文件中的位置'标记为以后的断点定义? 我使用这些标签来设置GDB中的断点.因此,无论我是否在标签之后/之前添加/删除代码行,断点仍然正确. 如果我将-Wno-error=unused-label添加到编译选项中,则编译器不会对我大喊大叫,但是标签从组件中消失了. 相反,我在代码中使用__attribute__((unused)),结果是相同的:没有投诉,但是标签已经消失了. 是否有正确的方法来完成此操作(而不是仅仅是黑客)? 这是我的玩具示例: int main(void){ int a = 15; label: __attribute__((unused)) a = a + 23; return a; } 汇编后,它导致: main: push ebp mov ebp, esp sub es
如果我有一个受 Intel JCC Erratum ,我如何在GCC中启用缓解措施(哪些调整分支位置以避免有问题的对齐),以及哪些GCC版本支持它? 解决方案 编译器: GCC:-Wa,-mbranches-within-32B-boundaries clang(10+):-mbranches-within-32B-boundaries编译器选项,而不是-Wa. msvc: icc:todo,寻找文档. GNU工具链在汇编器中进行缓解,并使用as -mbranches-within-32B-boundaries进行启用(气手册:x86选项): -malign-branch-boundary=32(大约32个字节边界).除了手册说此选项为指数,而不是2个直接功率,所以可能实际上是...boundary=5. -malign-branch=jcc+fused+jmp(默认值 包括+call+ret+indirect的任何 ) -malign-branch-
我有一个使用CPU特异性功能的Python扩展程序, 如果可供使用的话.这是通过运行时间检查完成的.如果是 硬件支持POPCNT指令,然后选择一个 我的内部循环的实现,如果可以使用SSSE3 它选择了另一个,否则会回到通用版本 我的性能关键内核. (大约95%以上的时间是 在此内核中花费.) 不幸的是,我没想到有一个故障模式.我 使用-mssse3和-O3来编译所有C代码 只有一个文件需要该-mssse3选项.结果,将其他文件汇编成SSSE3将存在的期望.这会导致该行的segfault: start_target_popcount = (int)(query_popcount * threshold); 因为编译器使用fisttpl,这是SSSE3指令. 毕竟,我告诉它假设存在SSSE3. 我的包裹最近遇到了这个问题的Debian Packager, 因为测试机的GCC了解-mssse3和 考虑到这一点,生成代码,但是机器本身具有 没有这些说明的较旧的CPU.
我当前使用" setuptools"来自动使用GCC在Linux上自动cython和Cython模块.从现在开始,我需要对提供给GCC的构建标志的更多控制.如果我在setup.py中使用以下内容: cythonize( [Extension("*", ["project/*.pyx"]) nthreads=4 ) 我得到了构建标志,看起来像: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -march=x86-64 -mtu
我想使用__device__ lambda,但它说我需要传递标志' - exptended-lambda'. 我在Colab中使用此环境. !wget https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2- local_9.2.88-1_amd64 -O cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb !dpkg -i cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb !apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub !apt-get update !apt-get install cuda-9.2 !nvcc --version !pip install git+git://github.
我在NVRTC中编译了一个内核: __global__ void kernel_A(/* args */) { unsigned short idx = threadIdx.x; unsigned char warp_id = idx / 32; unsigned char lane_id = idx % 32; /* ... */ } 我知道整数部门和Modulo在CUDA GPU上的成本很高.但是,我认为应将这种划分的2分划分为2,直到我发现不是: : __global__ void kernel_B(/* args */) { unsigned short idx = threadIdx.x; unsigned char warp_id = idx >> 5; unsigned char lane_id = idx & 31; /* ... */ } 似乎kernel_B运行速度更快.当省略内核中
我从第9章学习你的haskell a haskell for a haskell for a haskell 按照惯例,我们通常不指定main的类型声明. 据我所知,此惯例是广泛的.但是,如果我使用-Wall标志进行编译,则缺少main的类型签名的程序,例如 -- test.hs -- main :: IO () main = print (1 :: Int) 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 ... $ 我很困惑...如果main的类型签名确实是多余的,为什么-Wall会导致GHC在丢失时抱怨?是否有充分的理由(除了摆脱该警告