Tag: 编译

为什么变量不能在C中的2个文件中定义两次

为什么我不能拥有一个; 在2个C文件中。 我打算将两者结合起来制作可执行文件。 我从经验中知道我不能,但我想找到标准C99所说的位置并密封我的理解。 我正在阅读http://www.open-std.org/jtc1/sc22/wg…docs/n1256.pdf中的 ISO C99标准。 它在第42页说: 6.2.2识别者的联系 1可以通过一个称为连接的过程,在不同的范围或相同的范围内多次声明一个标识符。通过一个名为linkage的过程来引用同一个对象或函数。有三种连接:外部,内部和无。 2在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明表示相同的对象或function。 在一个翻译单元内,具有内部链接的标识符的每个声明表示相同的对象或function。 没有链接的标识符的每个声明表示一个唯一的实体。 3如果对象或函数的文件范围标识声明包含存储类指定静态,则标识符具有内部链接。 4对于在存储类规范外部声明的标识符,在该范围内可以看到该标识符的先前声明,如果先前声明指定内部或外部链接,则后面声明中标识符的链接与在先前声明中指定的联系。 如果没有先前的声明可见,或者如果先前的声明没有指定链接,则标识符具有外部链接。 5如果函数的标识符声明没有存储类指定符,则其链接的确定就像是使用存储类指定符extern声明的。如果对象的标识符声明具有文件范围且没有存储空间 – 特定的,它的联系是外在的。 看完之后看起来如果我声明一个变量就像说int a; 在2个源文件中。 然后根据规则5和4都有外部链接,然后根据规则2,两者都应该引用同一个对象。 那为什么编译器会产生问题。 在标准中,暗示我们不能在2个源文件中声明这样,这应该抛出编译错误。 首先,在标准中,它表示int a是一个定义,然后它表示2个定义实例是不可接受的。 我知道这是不允许的,但是如果我能在标准中找到并密封我的理解,这对我来说非常有用。 请将以下标准的摘录与此规则相结合? 或者我错过了胶水? : 声明规定了一组标识符的解释和属性。 标识符的定义是对该标识符的声明: – 对于一个对象,导致为该对象保留存储; – 用于function,包括function体; – 对于枚举常量或typedef名称,是标识符的(唯一)声明。 正如5.1.1.1中所讨论的,预处理后的程序文本单元是一个翻译单元,它由一系列外部声明组成。 这些被描述为“外部”,因为它们出现在任何function之外(因此具有文件范围)。 正如6.7中所讨论的那样,一个声明也会导致为对象或由标识符命名的函数保留存储,这是一个定义。 外部定义是外部声明,它也是函数(除了内联定义)或对象的定义。 如果在表达式中使用了使用外部链接声明的标识符(除了作为sizeof运算符的操作数的一部分,其结果是整数常量),整个程序中的某个地方应该只有一个外部定义用于标识符; 否则,不得超过一个。 谢谢。

GCC:在Windows上编译OpenCL主机

我只想尝试在Windows下使用OpenCL。 摘要 :我尝试编译时遇到了“ undefined reference to ”错误 (使用命令gcc my.o -o my.exe -L “C:\Program Files (x86)\AMD APP\lib\x86_64” -l OpenCL )。 我的代码 #include #include int main(void) { cl_platform_id platform; int err; err = clGetPlatformIDs(1, &platform, NULL); if(err < 0) { perror("There's No Platform!"); exit(1); } /* Some more code… */ system("PAUSE"); } Makefile文件 all: addition addition: gcc […]

确定C可执行文件名称

当我们编译C程序时,输出存储在a.out中。 我们如何将编译后的输出重定向到另一个文件?

使用make编译多个C文件

(我正在运行Linux Ubuntu 9.10,所以可执行文件的扩展名是executablefile.out)我刚刚进入C语言的模块化编程(用多个文件编程),我想知道如何在一个makefile中编译多个文件。 例如,编译这些文件的makefile是什么:main.c,dbAdapter.c,dbAdapter.h? (顺便说一句,如果你还没有弄明白,主要function是在main.c中)还有人可以发布一个指向makefile文档的链接吗?

编译背后的主要步骤是什么?

编译C程序的主要步骤是什么? 通过编译,我的意思是(可能是错误的)使用gcc从包含C代码的纯文本中获取二进制文件。 我很想了解这个过程的一些关键点: 到那天结束时,我需要将我的C代码转换为我的CPU应该理解的语言。 那么,谁在乎了解我的CPU特定指令呢? 操作系统? gcc是否将任何C转换为汇编语言? 我知道(实际猜测)对于每种处理器类型,我将需要一个汇编程序来解释(?)汇编代码并转换为我的CPU特定指令。 这个汇编程序(谁发货)在哪里? 它是否附带操作系统? 如果我用文本编辑器打开二进制文件,为什么我看不到0和1?

为C程序设置默认NetBeans选项(-std = c99,-Wall)

我安装了NetBeans 6.9并在Ubuntu Linux 11.10上正常运行。 我的目标是设置默认情况下使用的-Wall和-std=c99等编译器选项 。 目前,我必须右键单击我的项目 – >属性 – > C编译器 – >警告级别为“ 更多警告 ”,并将-std=c99添加到其他选项 。 在创建许多项目时,这显然是一种痛苦, 我确信有一种方法可以将所有这些都设置为默认项目 。 我发现这个post与我的问题密切相关。 但是,唯一的答案是安装Code :: Blocks和MSYS 1.0.11,这对我来说没什么意义。 我没有看到安装另一个IDE会如何帮助我,MSYS似乎没必要,因为我已经在使用Linux了。 我已经尝试了我能想象到的每一个合理的搜索词,我很惊讶我发现的信息很少。 似乎大多数使用NetBeans的人都应该在某些时候改变这种类型的东西。 我正在搜索的术语: ‘NetBeans -std = c99 default’ , ‘NetBeans设置默认编译选项’ , ‘如何使NetBeans默认使用c99’和‘Code :: Blocks设置到NetBeans’ 。 请有人指出我正确的方向,或告诉我我应该寻找什么。 我想其他人也有同样的问题,所以我希望这个post有用。

为什么汇编需要这么长时间?

我正在设计一种编程语言,我想到的问题之一就是为什么编程语言需要很长时间才能编译。 假设c ++需要很长时间,因为它需要在每次编译文件时解析并编译头文件。 但是i -heard-预编译的头文件需要多长时间? 我怀疑c ++不是唯一有这个问题的语言。

C编译:collect2:错误:ld返回1退出状态

我尝试在线搜索该bug,但所有post都是针对C ++的。 这是消息: test1.o:在函数ReadDictionary’: /home/johnny/Desktop/haggai/test1.c:13: undefined reference to home / johnny / Desktop / haggai / test1.c: ReadDictionary’: /home/johnny/Desktop/haggai/test1.c:13: undefined reference to CreateDictionary的ReadDictionary’: /home/johnny/Desktop/haggai/test1.c:13: undefined reference to ‘collect2:error:ld返回1退出状态make:*** [test1]错误1 超级简单的代码,无法理解是什么问题 #include #include #include #include “dict.h” #include “hash.h” pHash ReadDictionary() { /* This function reads a dictionary line by line from the standard input. */ pHash […]

静态链接LAPACK

我正在尝试发布一些软件,目前正在编写构建过程的脚本。 我陷入了一些我从未想过会发生的事情,在x86_64 linux上静态链接LAPACK。 在配置期间AC_SEARCH_LIB([main],[lapack])工作,但是lapack单元的编译不起作用,例如undefiend reference to ‘dsyev_’ no lapack / blas例程的不undefiend reference to ‘dsyev_’不被注意。 我已经确认我已经安装了库,甚至自己用适当的选项编译它们,使它们具有相同的结果。 这是我几年前第一次使用LAPACK时使用的一个例子,它可以动态地工作,但不是静态工作: http : //pastebin.com/cMm3wcwF 我用来编译的两个方法如下, gcc -llapack -o eigen eigen.c gcc -static -llapack -o eigen eigen.c

如何部分禁用cmake C / C ++自定义编译器检查

我正在尝试使用cmake进行一些交叉编译。 有些很容易通过Internet上的所有示例,我设法在Linux(x86和ARM),Windows和Android上交叉编译我的库。 但现在我想在自定义平台上进行。 我需要实现的过程: 采购我的环境(这会摧毁所有以前的bash经典环境) 用cmake编译 执行我想要的 但是Cmake正在测试我的自定义C / C ++库中的符号,这使得我的库无法编译。 我遇到的错误是cibke某些版本的GLIBCXX和CXXABI(没有C问题),但不是全部。 有没有办法使cmake好吗? 编辑: 我试过用: set(CMAKE_C_COMPILER_WORKS TRUE) set(CMAKE_CXX_COMPILER_WORKS TRUE) 与: include(CMakeForceCompiler) … cmake_force_c_compiler(${ENV_PATH}/bin/${CC}) cmake_force_cxx_compiler(${ENV_PATH}/bin/${CXX}) 但是cmake仍在检查符号。