此外,是否直接在相应标签的对面列出它们是否将它们设置为调试和发布版本?
tl; dr:当我以一种方式编译代码时,可执行文件会快速运行.当我使用我的makefile时,它慢了~10倍(可执行速度,而不是编译时间).
当我编译以下代码(使用Eigen包)时:
#include <Eigen/Dense> // For matrix math
#include <iostream>
using namespace std;
using namespace Eigen;
// Loop an infinite number of times, computing dot products.
int main(int argc, char * argv[]) {
setNbThreads(16);
initParallel(); // Tell Eigen that we're going to be multithreaded.
int n = 100;
VectorXf a(n), b(n);
for (int counter = 0; true; counter++) {
a[0] = a.dot(b) / n;
if ((counter + 1) % 10000000 == 0) {
cout << counter / 10000000 << …Run Code Online (Sandbox Code Playgroud) 如标题.它是默认的还是使用我们将不得不添加的C++ 11功能-std=c++11?
现在,由于这个选项,C++ 11仍然感觉像一些额外的,非标准的东西.
要指定编译器,-std=c++11clang,g ++甚至ICC都使用flag.
我开始在 Debian 8 下使用 gcc 进行多线程编程。我已经成功编写并运行了一个多线程测试应用程序 (foobar.c),但我对 Makefile 感到困惑(从示例中复制)。特别是,有效的命令是
gcc foobar.c -o foobar -pthread
Run Code Online (Sandbox Code Playgroud)
我对“-pthread”感到困惑。就是它
(a) 值为“thread”的选项“-p”,或
(b) 参数“-pthread”?
如果是任何一种情况,它实际上在做什么?包括一些图书馆?包括一些对象?设置其他选项?
我目前正在尝试构建 OpenPose。首先,我将尝试描述环境以及由此产生的错误。Caffe 是从源代码构建的,它完整地位于 [/Users...]/openpose/3rdparty 而不是通常的位置(为了隐私,我在这篇文章中编辑了文件路径的某些部分)。它的所有包含文件都可以在 [/Users...]/openpose/3rdparty/caffe/include/caffe 中找到。输入此命令后:
make -j`sysctl -n hw.logicalcpu` CXXFLAGS=-I[/Users/..]/openpose/3rdparty/caffe/include
Run Code Online (Sandbox Code Playgroud)
此错误如下:
[ 0%] Building CXX object src/openpose/CMakeFiles/openpose.dir/core/arrayCpuGpu.cpp.o
[ 1%] Building CXX object src/openpose/CMakeFiles/openpose.dir/face/faceExtractorCaffe.cpp.o
[ 1%] Building CXX object src/openpose/CMakeFiles/openpose.dir/hand/handExtractorCaffe.cpp.o
[ 2%] Building CXX object src/openpose/CMakeFiles/openpose.dir/net/bodyPartConnectorCaffe.cpp.o
[ 2%] Building CXX object src/openpose/CMakeFiles/openpose.dir/net/maximumCaffe.cpp.o
[ 2%] Building CXX object src/openpose/CMakeFiles/openpose.dir/net/netCaffe.cpp.o
[ 2%] Building CXX object src/openpose/CMakeFiles/openpose.dir/net/netOpenCv.cpp.o
[ 2%] Building CXX object src/openpose/CMakeFiles/openpose.dir/net/nmsCaffe.cpp.o
[/Users/..]/openpose/src/openpose/core/arrayCpuGpu.cpp:3:14: fatal error: 'caffe/blob.hpp' file not found
#include <caffe/blob.hpp>
^~~~~~~~~~~~~~~~
1 error generated.
make[2]: *** [src/openpose/CMakeFiles/openpose.dir/core/arrayCpuGpu.cpp.o] Error 1
make[2]: …Run Code Online (Sandbox Code Playgroud) 我面临以下情况。我有一个这样的结构:
typedef struct
{
uint8 nibble_1 : 4;
uint8 nibble_2 : 4;
uint8 data_1;
uint8 data_2;
uint8 data_3;
} NibbleStruct;
Run Code Online (Sandbox Code Playgroud)
背景信息:它是用于 CAN 通信的 32 位消息。
在代码中我有以下内容:
...
NibbleStruct nibble_struct;
uint8 nibble_to_assign = 0U;
nibble_struct.nibble_1 = nibble_to_assign;
...
Run Code Online (Sandbox Code Playgroud)
我需要保留 GCC (gnu99) 标志-Werror=conversion,但这会给出错误消息:
file_name.c 错误:从 'uint8' 转换为 'unsigned char:4' 可能会改变其值 [-Werror=conversion]|
我尝试用类似的东西进行投射
...
nibble_struct.nibble_1 = (uint8:4) nibble_to_assign; // invalid code
...
Run Code Online (Sandbox Code Playgroud)
和
...
nibble_struct.nibble_1 = (uint8) nibble_to_assign : 4; // invalid code
...
Run Code Online (Sandbox Code Playgroud)
但对于这不能编译并不感到惊讶。
有什么方法可以将我的变量转换为结构的nibble_to_assign 半字节吗?nibble_1或者在结构体外部的代码中声明一个半字节。
c variable-assignment compiler-flags compiler-warnings nibble
我正在尝试设置一个makefile来编译一个相当迟缓的程序的多个段.为了做到这一点,我希望Makefile能够一次传递MULTIPLE调试标志所以我可以一起测试多个不同的函数集.
所以在我的Makefile中:
debug:
gcc -Wall -O -o my_malloc main.c -D experimental leak <-- SECOND FLAG
./my_malloc
Run Code Online (Sandbox Code Playgroud)
在我的C代码中我想做:
#ifdef experimental
printf("MALLOC PROGRAM IN DEBUGGING MODE\n");
#endif
//executing both conditionals at once in one line.
#ifdef leak
puts("TESTING LEAK DETECTION");
#endif
Run Code Online (Sandbox Code Playgroud) 我试图将所有原始内容CMAKE_CXX_FLAGS作为参数传递给target_compile_options函数.
的CMakeLists.txt
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++0x -Wall -pedantic -Werror -Wextra)
# I'd wish this target_compile_options
target_compile_options(my_target INTERFACE ${CMAKE_CXX_FLAGS})
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:
g++.exe: error: -std=c++0x -Wall -pedantic -Werror -Wextra: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我知道一个简单的解决方案是:
target_compile_options(my_target INTERFACE -std=c++0x -Wall -pedantic -Werror -Wextra)
Run Code Online (Sandbox Code Playgroud)
但是我想保留原件SET(CMAKE_CXX_FLAGS ...),是否可能?
提前致谢!
使用标志(基于这篇文章)
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
Run Code Online (Sandbox Code Playgroud)
和
IMAGE_FILE_NET_RUN_FROM_SWAP
Run Code Online (Sandbox Code Playgroud)
当可执行文件位于LAN路径或可移动设备中时,可以将可执行文件加载到内存中.
即使exe在本地光盘上,有没有办法实现相同的目的?
我知道几乎没有性能提升,但要"摆脱光盘"这是一个想法.我没有在文档中找到这样的编译器选项.
在试图添加此标志:-Wshadow=compatible-local (文档)编制,但它只是不断抛出此消息时:
`error: unknown warning option '-Wshadow=compatible-local';
did you mean '-Wshadow- uncaptured-local'?
[-Werror,-Wunknown-warning-option]`
Run Code Online (Sandbox Code Playgroud)
我的makefile的片段:
# COMPILER & FLAGS ============================================================
CC = gcc
CFLAGS = -g -std=c11 -O3 \
-Wall -Wextra -Werror \
-Wshadow -Wshadow=compatible-local \
-Wno-sign-compare \
-fsanitize=integer \
-fsanitize=undefined \
-fsanitize=address -fsanitize-address-use-after-scope
Run Code Online (Sandbox Code Playgroud)
更新:
注意:我的编译器版本是clang-900.0.39.2.(它说clang即使你输入gcc,因为我正在使用macOS并且很好...... @Aconcagua解释了为什么在下面)
有人知道为什么会这样吗?和/或如何修复它?
我想知道,C 编译器(即 GCC 或 GHS)是否有一个标志来检查输入参数是否被修改?
我的意思是,如果我有以下功能,x并且y如果我不将const它们添加到它们中,则可能会在该功能内进行修改(就像现在发生的那样)。所以我想知道编译器是否可以检测到这种情况,以及是否存在这样做的标志。
int16_t myFunc(int16_t* x ,int16_t* y, bool* e)
{
int16_t z = 0;
z = *x + *y;
*x = 16; // this is wrong on purpose and I would like to detect it
if ( z < 0)
{
*e = true;
}
return z;
}
Run Code Online (Sandbox Code Playgroud)