在OSX的开发环境中,存在框架的概念.框架是一种包含头,共享库和其他有用东西的包.可以将框架传递给编译器,以便编译器在搜索路径中包含其标头,并使用其共享库将程序与它们链接.
因此,例如,如果-framework FrameworkName在OSX上传递给gcc或clang,编译器会查找/System/Library/Frameworks目录以查找FrameworkName.framework目录.如果找到,编译器将包含其标头并将程序与其共享库链接.
那么,这个超级有用的功能是否适用于Linux?gcc或clang是否认可-frameworkLinux上的选项?当我在Linux上键入此选项时,编译器似乎无法识别它,但这可能是因为我需要在它之前设置框架目录路径.是否有任何特殊技巧可以使它在Linux上运行?或者这在这个平台上绝对不可能?
gcc -m32 main.cpp
gcc -m64 main.cpp
gcc main.cpp
Run Code Online (Sandbox Code Playgroud)
什么是之间的差异-m32,-m64以及nothing在gcc的选项?
我的C++应用程序(使用g ++编译)需要在Pentium-4(32位)及更高版本上运行.但是,它通常与Core2Duo或更好的处理器一起使用.
我目前正在使用:-march = pentium4 -mtune = pentium4.但有些阅读促使我认为-march = pentium4 -mtune = generic可能会更好.
任何人都可以对此有所了解吗?在这种情况下,march&mtune选项的最佳值是什么?
平台:RHEL 5.3(32位)上的GCC 4.1.2.
长话短说——我使用 Ted Krovetz 的实现来计算UMAC和UMAC AE加密 ( http://www.fastcrypto.org/ )。
当我用 编译我的代码(和/或中的测试umac.c)时-std=c99,计算出的结果UMAC与预期完全不同(并且是错误的)。当我删除这个选项时,一切都像魅力一样。
有什么想法可能导致这种情况吗?我可以做什么来检查发生了什么以及什么产生了不同的结果?
$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
$ uname -a
xxx 3.13.0-43-generic #72-Ubuntu SMP .. x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
我不使用任何其他选项 - 只是使用和不使用-std=c99.
再说几句话:
我会尝试联系 Ted Krovetz 并向他询问这个问题(可能是一些错误或其他问题),但这不是重点。这个问题有点笼统,这个具体问题可以看作是一个例子。
我跑了valgrind——没什么特别的。添加-Wall并且-Wextra-什么也没有了。听起来像UB,但valgrind没有抱怨任何事情。
这种情况非常有趣,花了我很多天和头痛才明白,问题不在我的代码中(我使用这个实现来实现复杂的协议),而是在算法中,尤其是在这个选项中。所以我决定征求意见。
在 C 和 C++ 中都有效的代码在用每种语言编译时会产生不同的行为吗?根本不相关,因为我们在这里谈论的是同一种语言。
这种没有“-std=c99”的巨大 fprintf 速度差异很接近,但还不够。
编辑
这是我的测试结果和我所做的(源/标题刚刚下载,我没有更改任何内容): …
我对 make 文件不太有经验,并且正在尝试在 Eclipse (linux) 中的 make 文件中定义预处理器变量。
这变成了一项不平凡的任务,因为它似乎遗漏了一些东西......
您可以在下面找到我的 make 文件的结构:
var_first=g++
all:
g++ main_cell.cpp -o hello
Run Code Online (Sandbox Code Playgroud)
以这种方式构建我的代码,我想要做的是在我的 make 文件中定义一个变量,然后在我的代码中使用 #ifdef、#endif 对其进行断言。
我已经经历了无数的组合,但似乎缺少一些步骤......
您能给一些指点吗?
我正在使用Microsoft.QualityTools.Testing.Fakes来模拟一些单元测试.
但此程序集仅适用于使用VisualStudio Ultimate的用户.
具有其他版本(专业版)的用户无法构建和运行此测试项目,并且在其环境中出现错误.
所以我创建了一个编译器指令来处理这个问题:
#define Ultimate
#if Ultimate
using Microsoft.QualityTools.Testing.Fakes;
#endif
Run Code Online (Sandbox Code Playgroud)
我的测试方法是:
#if Ultimate
using (ShimsContext.Create())
{
... My code
}
#else
Assert.Inconclusive("This test needs VS Ultimate to run");
#endif
Run Code Online (Sandbox Code Playgroud)
这很有效,但用户仍需要注释/取消注释定义行.
那么,有没有办法将我的VS版传递给编译器?或者还有另一种方法吗?
c# unit-testing compiler-options visual-studio vs-unit-testing-framework
最近我发现了一个由 If 语句中的赋值引起的令人讨厌的错误。我认为 if 赋值对我来说是一个糟糕的模式,我想完全关闭它以获得编译器 varnings 而不是实际的错误。
我怎么能在打字稿中做到这一点?
假设节点的任何版本,我该如何找到相应的打字稿编译器选项的target,让大多数的功能?我要删除来宾工作。
指定ECMAScript目标版本:“ ES3”(默认),“ ES5”,“ ES6” /“ ES2015”,“ ES2016”,“ ES2017”或“ ESNext”。
我运行不同版本的节点,我想知道何时启用不同TSC目标的最低节点版本。
假设我的代码具有以下功能:
inline int foo() {
bar();
int y = baz();
return y;
}
Run Code Online (Sandbox Code Playgroud)
并假设bar()和baz()有副作用。
如果我写:
int z = foo();
printf("z is %d\n", z);
Run Code Online (Sandbox Code Playgroud)
那么显然都bar()和baz()必须执行。但如果我写:
foo();
Run Code Online (Sandbox Code Playgroud)
并且不使用返回值,调用的唯一原因baz()是它的副作用。
有没有一种方法可以告诉我的编译器(对于:GCC、clang、MSVC、Intel 中的任何一个),例如“baz()为了决定是否优化它,您可能会忽略它的副作用”?或者“为了决定是否优化它,您可能会忽略此指令的副作用”?
这个问题是针对 C 和 C++ 提出的,但可能与各种过程语言相关。让我们使用 C++,因为这是我现在最常用的。
笔记:
bar(),baz()不在我的控制之下。foo()不得更改。当然baz(),如果我愿意,我可以使用一些代理并懒惰地应用;或者只是为不使用的情况编写一个不同的函数y。这不是我要问的。c++ side-effects compiler-optimization compiler-options elision
在Windows中,当编译C++时,我可以指定/MT编译器选项来使用运行时库的静态版本,即。不动态链接到 MSVCRT。
既然没有这样的选项,Rust/Cargo 在这方面的表现如何?它是静态链接还是动态链接?
compiler-options ×10
gcc ×4
typescript ×2
c ×1
c# ×1
c++ ×1
c99 ×1
clang ×1
ecma ×1
elision ×1
frameworks ×1
g++ ×1
linux ×1
makefile ×1
node.js ×1
rust ×1
rust-cargo ×1
side-effects ×1
unit-testing ×1