A. 开发一个c语言程序要经过哪四个步骤
开发一个C语言程序需要经过的四个步骤:编辑、编译、连接、运行。
C语言程序可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。
1、预处理:输入源程序并保存(.C文件)。
2、编译:将源程序翻译为目标文件(.OBJ文件)。
3、链接:将目标文件生成可执行文件( .EXE文件)。
4、运行:执行.EXE文件,得到运行结果。
(1)源代码编译安装程序的基本过程扩展阅读:
C语言代码变为程序的几个阶段:
1、首先是源代码文件test.c和相关的头文件,如stdio.h等被预处理器cpp预处理成一个.i文件。经过预编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i文件中。
2、编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化后产生相应的汇编代码文件,这个过程往往是我们所说的整个程序的构建的核心部分,也是最复杂的部分之一。
3、汇编器不直接输出可执行文件而是输出一个目标文件,汇编器可以调用ld产生一个能够运行的可执行程序。即需要将一大堆文件链接起来才可以得到“a.out”,即最终的可执行文件。
4、在链接过程中,对其他定义在目标文件中的函数调用的指令需要被重新调整,对实用其他定义在其他目标文件的变量来说,也存在同样问题。
参考资料来源:网络-c语言
B. 简述将源程序编译成可执行程序的过程
一个源程序到一个可执行程序的过程:预编译、编译、汇编、链接。其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。
预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则如下:
1、删除所有的#define,展开所有的宏定义。
2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
4、删除所有的注释,“//”和“/**/”。
5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。
(2)源代码编译安装程序的基本过程扩展阅读:
编译过程中语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。
其中,静态语义通常包括:声明和类型的匹配,类型的转换,那么语义分析就会对这些方面进行检查,例如将一个int型赋值给int*型时,语义分析程序会发现这个类型不匹配,编译器就会报错。
C. C语言编写好代码后,怎么编译,最后生成可执行文件
材料/工具:vc6.0
1、打开c语言编辑工具,在工具中写入程序的源代码。
D. linux系统下源代码编译方式安装软件的大致步骤
是什么语言呢? linux下多数用gcc
E. 源码怎么编译
使用编译器如VC++6.0,VC++2008
F. linux中源代码包安装的基本步骤是什么
详解linux源码包安装过程
1. 解压缩包
可以通过下载或其他方式获得了一个软件包,通常它是一个压缩文件,大部分可能是存档的和压缩的,这些文件一般以 .tar .gz为扩展名。
首先拷贝它到一个目录,然后 untar 和 gunzip 解压它。 通常这个命令是
tar xzvf filename [filename 是软件文件名称]
解压后的文件一般会在当前目录下的创建子目录,并以这个包名来命名。 你也可以用用这个命令预先查看结果 tar tzvf filename,显示包里有那些解压文件。
源文件如果是新的 bzip2 (.bz2) 格式,可用
bzip2 -cd filename | tar xvf -,或更简单的 tar xyvf filename ,这很不错的tar命令被不断的完善。
说明:
A:有时候一些文件必须安装在用户的 home 目录下,或更多的是在一个固定的目录,比如 /, /usr/src, 或 /opt 。所以必须仔细阅读安装包的配置信息。当一个软件包里如果有config 和 Makefiles 文件则最好去编辑它,这里包括了安装指令和说明。提示:你改变 makefile 会导致不同的结果。大部分软件包允许用 make install 自动处理安置二进制文件在适当的系统位置。
B:你可能碰到过一些共享文件、shell 存档文件、尤其是 Internet 上的源码新闻组。它们保留的原因是具有人性化的可读性,并且允许新闻组缓冲并通过它们筛选和剔除出不合格的。它们可能用 unshar filename.shar 命令来解压。
C: 一些源码存档文件是用非标准的 DOS,Mac 或其他压缩的比如:
zip, arc, lha, arj, zoo, rar, and shk.
D: 有时候,你可能需要使用一个 patch 或显示改变了的 diff 文件来升级或修复存档的源码文件。这 doc 文件或者 README 文件将告诉你怎么去使用。一个很好的命令用标准语法来调用的命令是 patch < patchfile.
2: 关于 rpm 安装包
一些 Linux 用户惧怕通过使用源码来手动安装软件包,不过现在有方便的 rpm 和 deb 或 新格式的 slp 包。例如:rpm 安装运行平稳又快,作为一个软件安装在某几个有名的操作系统。
作为方便的RPM包也存在很多不好的缺点,例如:
A: 要了解软件中更多更详细的内容你必须去在二进制中去了解,而不是rpm包。
B: 还有安装一个 rpm 包如果需要依赖关系那么安装就可能会导致失败。
C: 当 rpm 请求你系统中不同版本的库,那么安装将不能继续,除非你为错误的库位置创建连接符号到正确的位置。
说明:必须使用root 安装 rpm 和 deb 。因为它需要必须的写入权限。
最简单的,用命令 rpm -i packagename.rpm 和 dpkg --install packagename.deb 会自动解包和安装。
3:关于安装 Linux 包出现的一些问题及解决方案
假设 make 失败有个链接错误: -lX11: No such file or directory,正好在 xmkmf 之后已被调用,这可能意味着 Imake 不能被完全建立。检查第一部分 Makefile 文件的的行是这样:
· LIB= -L/usr/X11/lib
· INCLUDE= -I/usr/X11/include/X11
· LIBS= -lX11 -lc -lm
这个 -L 和 -I 开关告诉编译器和链接分别在哪里找到 library 和 include 文件。在这个例子里, X11 库应该在 /usr/X11/lib 目录,且 X11 包含文件应该在 /usr/X11/include/X11 目录里。假如对于你的机器上的这个错误,请处理修改 Makefile 并重新再 make。
没有声明涉及的数学库函数,像下列各项:
/tmp/cca011551.o(.text 0x11): undefined reference to `cos'
要修复它,需要明确链接到匹配的库,在 Makefile (看先前的例子) 里增加一个 -lm 到 LIB 或 LIBS 标记 。
用其他方法尝试
仍然失败 如果失败,参考下列脚本:
make -DUseInstalled -I/usr/X386/lib/X11/config
这个直接方式的类别相当于。
在少数例子里,用 root 运行 ldconfig 可能会解决:
# ldconfig 更新共享库链接符号。
一些 Makefiles 使用你系统里未被承认的库别名。一个例子,构建可能需要 libX11.so.6 ,但是在 /usr/X11R6/lib 不存在文件或链接。然而,在那里是 libX11.so.6.1。解决方法是用 root 运行ln -s /usr/X11R6/lib/libX11.so.6.1 /usr/X11R6/lib/libX11.so.6 ,接着需要运行 ldconfig 。
有一些包需要你安装一个或更多库的升级版本。需要拷贝一个或更多的库到适当的目录里,删除旧的库,重新设置动态链接库。
4:一些其他的问题处理
安装一个shell 脚本如果出现:No such file or directory 的错误消息。这是可以检查文件权限确定文件事可执行的,并检查文件头确定是否 shell 或程序是脚本在指定的位置被调用。一个例子,这个脚本可能是这样开始的:
#!/usr/local/bin/EDEN
如EDEN的实际安装位置是在你的 /usr/bin 目录,用一个 /usr/local/bin 替代
这个脚本不能运行有两个方法来纠正!!
A: 文件头改成 #!/usr/bin/EDEN
B: 或增加一个链接符, ln -s /usr/bin/EDEN
5:一个典型的例子 Xloadimage
首先说明下面的例子来源于国外网站的一个技术实例,这里我做了翻译和整理。
这个例子展现一个简单的问题。xloadimage 程序对我的图形工具的调整设置是有用的附加。从源码目录拷贝文件,用 tar xzvf 解压文件,可是在运行 make 的时候出现令人讨厌的错误并停止了。
gcc -c -O -fstrength-rece -finline-functions -fforce-mem
-fforce-addr -DSYSV -I/usr/X11R6/include
-DSYSPATHFILE=\"/usr/lib/X11/Xloadimage\" mcidas.c
In file included from /usr/include/stdlib.h:32,
from image.h:23,
from xloadimage.h:15,
from mcidas.c:7:
/usr/lib/gcc-lib/i486-linux/2.6.3/include/stddef.h:215:
conflicting types for `wchar_t'
/usr/X11R6/include/X11/Xlib.h:74: previous declaration of
`wchar_t'
make[1]: *** [mcidas.o] Error 1
make[1]: Leaving directory
`/home/thegrendel/tst/xloadimage.4.1'
make: *** [default] Error 2
这个错误消息包含了实质的线索:
查看 image.h 文件的 23 行:
#include < stdlib.h>
在源码的某处对于 xloadimage, wchar_t 已经在指定标准 include 文件重新定义。 告诉我们首先在 image.h 的 23 行尝试注释它,或许 stdlib.h include 是不存在的,毕竟不是所有都是必需的。
在这点,构建中的收益来源于所有任何一个致命错误。xloadimage 现在功能正常。
6: 安装 Linux 包的一些总结
坚持自己动手处理所有的安装出现的问题,不断总结努力学习,从错误里去仔细研究,努力动手排错,从每个不足甚至失败的地方得到扩充和提升,可以增强安装构建软件的技巧。
G. 如何自己编译源代码
我们使用编译器将自己的源代码转换成目标代码, 使用链接器将我们的目标代码链接成一个可执行程序。另外, 我们使用一些程序在计算机中输入源代码文本并且编辑它。这些是最初的和最重要的工具, 它们构成程序员的工具集合或“程序开发环境”。 如果你使用的是命令行窗口, 就像很多专业程序员所做的那样, 你将不得不自己来编写编译和链接命令。如果你使用IDE(“交互式开发环境”或“集成式开发环境”), 就像很多程序员所做的那样, 简单地点击正确按钮就可以完成这个工作。附录C介绍了如何在你的C++实现中编译和链接。 IDE通常包括一个具有有用特性的编辑器, 例如用不同颜色的代码来区分你的源代码中的注释、 关键字和其他部分, 以及其他帮助你来调试代码、 编译和运行代码的功能。调试是发现程序中的错误和排除错误的活动, 你在前进的道路上会听到很多有关它的内容。 我们使用微软的Visual C++作?喑炭 ⒒肪呈道 H绻 颐羌虻サ厮怠氨嘁肫鳌被蚴恰癐DE”的某些部分, 那就是所指Visual C++系统。但是, 你可以使用一些提供最新的、 符合标准的C++实现的系统。我们所说的大多数内容(经过微小的修改)对所有的C++实现都将是正确的, 并且其代码可以在任何地方运行。在工作中, 我们使用几种不同的实现。
H. 新人求教 驱动源码编译安装
1、安装scons
(1) 下载python2.7, 使用x86_32位,因为scons只有32位安装包可用;
(2) 下载scons2.3.0;
(3) 安装python 和 scons, 将C:\Python27\Scripts写入PATH;
(4) 下载安装pywin32 ,It is recommended you install pywin32 if you want to do parallel builds (scons -j)
2、安装boost库(1.49版本).
解压后双击bootstrap.bat,生成bjam.exe后,cd到目录c:\boost下,(将boost_1_49更名为boost了)编译boost。
编译命令:C:\boost>bjam variant=release --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32
这是使用VS2010环境编译的release版本,编译完成后,生成C:\boost\stage\lib文件夹,下面有6个lib库:
如果要编译成debug版本,使用命令:bjam variant=debug --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32
编译完成后,生成C:\boost\stage\lib文件夹,下面有10个lib库和dll:
此处为MongoDB文档中对于编译boost库的要求原文:
When using bjam, MongoDB expects
variant=debug for debug builds, and variant=release for release builds
threading=multi
link=static runtime-link=static for release builds
address-model=64 for 64 bit(64位的话,把32换为64)。link=static runtime-link=static,boost需要编译成静态库,因为mongodb只会去链接boost的静态库
address-model=64在win7 64环境下此项必须,不加在编译mongodb的c++ client时会出现链接错误。
3、下载mongo2.4.6源码 http://www.mongodb.org/downloads官网下载
编译Mongoclient.lib
cmd命令提示符下,cd到解压后的文件目录,例如我放在了E盘,E:\mongodb-src-r2.4.6,输入命令:
scons –-dd --32 mongoclient.lib // build C++ client driver library
Add --64 or --32 to get the 64- and 32-bit versions, respectively. Replace --release with --dd to build a debug build.
编译后在mongodb\build\win32\32\dd\client_build\生成mongoclient.lib.
4、测试程序
就用Mongodb自带的例子吧,使用VS2010打开E:\mongodb-src-r2.4.6\src\mongo\client\examples中的simple_client_demo.vcxproj,编译,会提示生成simple_client_demo.sln,保存。
使用debug模式,配置工程环境:打开工程->属性,配置Configuration Properties下的VC++ Directories,头文件路径添加C:\boost,Lib库路径添加boost的lib,以及mongodb client的lib:
C:\boost\stage\lib
E:\mongodb-src-r2.4.6\build\win32\32\dd\client_build
进入C/C++下面的Code Generation,将Runtime Library设置为Multi-threaded Debug (/MTd)
进入Linker下面的Input,设置Additional Dependencies,添加ws2_32.lib,psapi.lib,Dbghelp.lib,mongoclient.lib
将E:\mongodb-src-r2.4.6\build\win32\32\dd\mongo\base下生成的error_codes.h和error_codes.cpp文件,拷贝到E:\mongodb-src-r2.4.6\src\mongo\base目录下。
ok,编译、运行.
5、问题解决
error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(dbclient.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(assert_util.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(jsobj.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(status.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(mutexdebugger.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
VS的版本不匹配,lib是在更高级的版本中编译生成的,而使用的时候,是在低级版本中使用的,所以出现了不匹配的错误。例如,我在VS2010 SP1和VS2012的环境下编译的,而使用是在VS2010上使用,所以在编译时,出现了以上问题。
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymCleanup
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymGetMoleInfo64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymInitialize
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_StackWalk64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymFromAddr
在工程依赖库中添加Dbghelp.lib
其它问题,看看你手头的编译器、编译出来的boost库版本、mongoclient.lib的版本,是否对应好了。