Tag: 编译

用c语言链接和加载有什么区别

链接和加载动态库是否都在运行时发生? 或者只是在运行时加载库?

给定堆栈和寄存器的状态,我们可以预测printf的未定义行为的结果

以下是类测验的一些简单C代码: #include int main() { float a = 2.3; printf(“%d\n”, a); return 0; } 编译并运行: Apple LLVM版本6.1.0( clang-602.0.53 )(基于LLVM 3.6.0svn) 目标: x86_64 -apple-darwin14.5.0 此代码的输出undefined 。 我试图通过检查调试器附近的内存(gdb中的X命令)来预测输出。 例如,当a的地址是0x7fff5fbffb98 , &a附近的上下文如下: 0x7fff5fbffb98: 1075000115 0x7fff5fbffb9c: 0 0x7fff5fbffba0: 1606417336 0x7fff5fbffba4: 32767 0x7fff5fbffba8: -1754266167 0x7fff5fbffbac: 32767 0x7fff5fbffbb0: -1754266167 0x7fff5fbffbb4: 32767 然后printf的输出是1606417352 。 我知道使用不正确的说明符时的输出是未定义的。 出于好奇,我预计这个未定义行为的输出与正在运行的堆栈或寄存器的某些内存有关,但我还没弄清楚如何关联它。 那么使用哪个地址或寄存器来设置这个printf的输出? 换句话说,给定运行堆栈的状态以及来自所有寄存器的所有值,我们可以预测(如果是这样)这种未定义行为的输出吗?

在GCC 4.8上构建Python(2.7)模块失败

我正在尝试使用C API构建Python模块/扩展写入,但它失败了: % python2 cmath.py build running build running build_ext building ‘c_math’ extension creating build creating build/temp.linux-x86_64-2.7 gcc -pthread -fno-strict-aliasing -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector –param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -DNDEBUG -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector –param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python2.7 -c c_math.c -o build/temp.linux-x86_64-2.7/c_math.o c_math.c:18:5: warning: initialization from incompatible pointer type [enabled by default] {“more”, c_math_more, METH_VARARGS, “n […]

Opencv函数只能以C代码方式调用,而不能以C ++方式调用

我是Opencv的新手。 根据说明下载并安装Opencv 2.4后,我开始编写我的第一个Opencv程序,该程序基本上是Web上教程的副本。 #include #include #include #include “cv.h” #include “highgui.h” #include #include #include using namespace std; using namespace cv; int main( int argc, char** argv ) { char* filename = “C:\\Research\abc.pgm”; IplImage *img0; if( (img0 = cvLoadImage(filename,-1)) == 0 ) return 0; cvNamedWindow( “image”, 0 ); cvShowImage( “image”, img0 ); cvWaitKey(0); cvDestroyWindow(“image”); cvReleaseImage(&img0); return 0; […]

是否可以将CLion配置为独立编译项目中的源文件?

我目前正在使用JetBrains CLion IDE在C中执行一些Project Euler挑战。 当我用Python和Java(分别在PyCharm和IntelliJ中)完成这些时,我总是能够创建一个名为“ProjectEuler”的项目,并添加我可以独立执行的任意数量的源文件。 但是,似乎在CLion中也是不可能的。 我用来解决问题的每个源文件都包含一个main()函数,每次我尝试编译时,CMake都对此感到不满(“main”的多重定义“)。 有没有办法将CLion配置为一次只编译和执行项目中的单个源文件,而不必每次都重写我的CMakeLists.txt或为每个问题创建一个新项目? 我知道C是编译的,而不是像Java或Python那样解释,但我可以想象只是手动编译每个源文件。 有没有办法配置CLion做同样的事情? 如果是这样,怎么样?

使用make在linux上编译驱动程序

这个错误信息是什么意思? 我正在尝试运行make。 看起来缺少配置。 配置是内核源的一部分? make -C /lib/modules/4.2.0-19-generic/build SUBDIRS=/home/glochild/Downloads/AX88179_178A_LINUX_DRIVER_v1.10.0_SOURCE modules make[1]: Entering directory ‘/usr/src/linux-headers-4.2.0-19-generic’ CC [M] /home/glochild/Downloads/AX88179_178A_LINUX_DRIVER_v1.10.0_SOURCE/ax88179_178a.o /home/glochild/Downloads/AX88179_178A_LINUX_DRIVER_v1.10.0_SOURCE/ax88179_178a.c:55:6: error: macro “__TIME__” might prevent reproducible builds [-Werror=date-time] ” ” __TIME__ ” ” __DATE__ “\n” ^ /home/glochild/Downloads/AX88179_178A_LINUX_DRIVER_v1.10.0_SOURCE/ax88179_178a.c:55:19: error: macro “__DATE__” might prevent reproducible builds [-Werror=date-time] ” ” __TIME__ ” ” __DATE__ “\n” ^ cc1: some warnings being treated […]

使用ld链接时,未定义引用’__main’

/* test.c */ void func1() { } int main() { func1(); } 您好,我正在使用C编写内核代码。但是我测试了上面的代码以了解如何构建C内核代码。 下面的命令就是我给出的提示。 我在Windows 8.1上使用MinGW。 gcc -c -m32 test.c ld -o test -Ttext 0x00 -e _main test.o 但这个错误是从ld发生的。 test.o:test.c:(.text+0x7): undefined reference to `__main’ 所以,我尝试了不同的方式。 为gcc添加-nostdlib和–freestanding选项。 但结果是一样的。 CRT0中是__main函数吗? 我该怎么做才能解决这个问题..?

C赋值语句的评估顺序

我遇到过跨平台代码在基本赋值语句中表现不同的情况。 一个编译器首先评估Lvalue,然后评估Rvalue,然后评估分配。 另一个编译器首先执行Rvalue,然后执行Lvalue,然后执行赋值。 如果Lvalue影响Rvalue的值,则可能会产生影响,如下例所示: struct MM { int m; } int helper (struct MM** ppmm ) { (*ppmm) = (struct MM *) malloc (sizeof (struct MM)); (*ppmm)->m = 1000; return 100; } int main() { struct MM mm = {500}; struct MM* pmm = &mm pmm->m = helper(&pmm); printf(” %d %d ” , mm.m , […]

为什么不能一起使用静态和寄存器存储类?

以下列方式定义变量时: static register int a1 = 0; 我们得到错误: error: multiple storage classes in declaration specifiers 这个错误有什么根本原因吗? 为什么变量既不能存储在寄存器中,也只能在启动/第一次调用时初始化? 可以将寄存器存储类附加到全局变量。 < – 编辑:不是真的

为什么编译器没有检测到字符串常量初始化中的越界?

我在一本书中读到了这个问题及其答案。 但我不明白这本书的理由。 下面的代码会编译吗? int main() { char str[5] = “fast enough”; return 0; } 答案是: 是的。如果超出数组的边界,编译器永远不会检测到错误。 我无法得到它。 任何人都可以解释一下吗?