
因为你提的问题,编译环境上很不明确所以我做了以下假设。
系统环境linux
编译器GCC
数据库mysql
(编译还需要安装mysql的接口-dev这个库)
这样的情况下只需要包含
然后做以下 *** 作
MYSQLmysql_init(MYSQLmysql);//初始化mysql
MYSQLmysql_real_connect(MYSQLmysql,constcharhost,constcharuser,constcharpasswd,constchardb,unsignedintport,constcharunix_socket,unsignedlongclient_flag);//连接数据库具体参数含义请查MYSQLAPI文档
intmysql_query(MYSQLmysql,constcharstmt_str);//执行sql语句如果想添加表的话stmt_str赋值为"CREATETABLEXXXX"就行了
在控制台 gcc /helloc -o /helloout,编译没错的话,就会在根目录出现一个helloout的文件,然后 /helloout,就可以看到结果了 具体参阅GCC的用法 一gcc历史 GCC最早是Richard Stallman在十几年前编写的针对于C的编译器,意思即为GNU C Compiler,后来发展支持Ada,C++,Java,Objective C,Pascal,COBOL,以及支持逻辑编程的Mercury语言,后来其英文原名变为:GNU Compiler ollection([1])除此之外,GCC对于各种硬件平台都提供了完善的支持。 一般的,GCC的编译功能包括gcc(C的编译器),g++(C++的编译器),在编译过程中,一共有四步工作。 1预处理,生成i文件,C文件编译为i文件,C++文件编译为ii文件,它们都为源程序的预处理结果文件以最简单的Hello World程序为例: // testc #include "stdioh" #define MAX 9 int main() { int a; a=MAX; printf("Hello Worldn"); } 用cpp testc testi 可得到预处理文件testi,通过查看该文件,我们可以看到,我们引入的include文件已经被引入处理,define定义的部分已经被完全带入。 2预处理文件转换成汇编语言,生成s文件。这一步利用egcs来完成(在mingw标准包中没有见到这个预编译器,所以测试没有成功,将继续测试) 3汇编变为目标文件,生成o文件,利用as来完成。 4连接目标文件,生成可执行程序,利用ld来完成(后续继续研究ld编译过程。) 二GCC参数祥解 -x language filename 设定文件使用的语言,这样源程序的后缀名无效了,并对gcc后接的多个编译文件都有效。这样如 果存在c和cpp文件联编会有问题,解决这个问题用到了下一个参数 -x none filename,在下面做介绍。因为在预处理过程中对于c和cpp文件的处理方式是不一样的。可以使用的参数有:'c','objective- c','c-header','c++','cpp-output','assembler','assembler-with-cpp'编译的时候, 如果有这样的一个用C语言写的testtmp的文件,用gcc编译的时候就用gcc -x c testtmp就可以让gcc用编译C语言的方式来编译testtmp -x none filename 关掉上一个选项,就是让gcc根据文件名后缀,自动识别文件类型。如用下列方式编译: gcc -x c testtmp -x none test2c 这样可以自由地选择编译方式 -c 只激活预处理,编译和汇编,也就是把程序做成obj文件。如gcc -c testc 就会生成testo文件,当然这样还只是目标文件,需要经过ld连接器对所有的o文件进行联接才能生成可执行文件 -S 只激活预处理和编译,把文件编译到汇编代码。相当到对源程序做一个egcs *** 作,生成s文件。可以查看生成的汇编文件结果。这个对于研究汇编语言的程序员来说是很有作用的。 -E 只激活预处理,这个将对文件进行预处理,将对所有引入的include文件和define定义的量进行代换,为我们开头所说的gcc 编译的第一步,即用cpp命令将程序语言文件进行预处理但这一步不生成结果文件,如果你需要生成结果文件保存,那么需要利用系统中的输出重定向。 -o 定制目标名称,缺省的时候在unix和linux平台下gcc filename的结果是一个文件名为aout的文件,windows下用mingw里带的gcc编译结果是aexe。如果我们用gcc -o helloexe testc的话,将生成helloexe可执行程序。这个并不一定只限于最后一步可执行程序的生成,如用上面所讲的-S生成的汇编程序也可以用-o参 数生成,比如 gcc -o helloasm -S testc 这样helloasm就是testc经过预处理和编译之后的结果。 -pipe 使用管道来代替编译中的临时文件,因为编译的整个过程有几个不同的步骤,每一个步骤都是以前一个步骤的输出为输入的,这样就涉 及到数据传递的问题,在没有-pipe参数的情况下,是用临时文件的形式来进行传递的,在有该情况的时候就利用管道来传递中间数据。当然,在某些系统中, 汇编不能读取管道数据,这样这个参数就不能正常工作了。 -ansi 关闭gnu c与ansi c不兼容的特性,激活ansi c的专有特性,在此情况下,处理器会定义一个__STRICT_ANSI__的宏,在有些头文件中会关注该宏是否被申明过,以避免某些函数的引入。此项可参照ansi c与gnu c的差别得到更多理解。 -fno-asm 此选项为ansi选项功能的一部分,禁止将asm,inline,typeof用作关键字。 -fno-strict-prototype 这个选项只对g++有作用。这个参数让编译器将所有没有参数的函数都认为是没有显式参数的个数和类型的函数,而不是没有参数。而对于gcc来说,会将没有带参数的函数认成没有显式说明的类型。 -fthis-is-variable 这个参数仅对C++程序有效,可以让this做一般变量使用,允许对this赋值 -fcond-mismatch 允许条件表达式的第二和第三参数类型不匹配表达式的值为void型 -funsigned-char -fno-signed-char -fsigned-char -fno-unsigned-char 这四个是对char在编译时进行的设置,它们分别决定将char设为unsigned char或signed char -include filename 加入头文件的位置,以使程序中顺利使用#include ,这样就可以在编译的时候这样编译:gcc testc -include /include/testh,进行联编。 -imacros filename 将filename中的宏扩展到gcc的输入文件里,宏定义本身不会出现在输入文件中。意即在编译某个文件testc的时候,它里面申明的宏如果在没有用到该参数的时候,生成目标文件之后就会被丢弃掉,而在用了这个参数之后,这些宏将被保留用于之后文件的编译。 -Dmacro 相当于#define macro,宏的内容为字符串'1'。如在编译的时候使用gcc -o testexe testc -DDEBUG就相当于在testc里面定义了DEBUG宏,值为字串'1'。可用如下程序测试可知: //testc #include "stdioh" int main() { printf("Hello Worldn"); #ifdef DEBUG printf("hellon"); #endif } 如用gcc -o testexe testc编译,刚运行结果为: Hello World 如用gcc -o testexe testc -DDEBUG编译,则运行结果为: Hello World hello 因此可以在下一种编译方法中相当于在testc里面定义了DEBUG宏。 -Dmacro=define 作用同上,但设定宏的值为define -Umacro 相当于给程序中定义的宏作了一次undefine即:#undef macro -undef 取消了对任何非标准友的定义 -Idir 在#include 的时候,先在用这个参数指定的位置找头文件,如果没有找到,则到缺省的目录找头文件 -I- 取消-Idir的作用,表明以后编译的程序将不在-Idir指定的目录里寻找头文件。 -idirafter dir 在-I的目录里面查找失败之后,再在这个目录里面查找头文件,这样的参数为设置头文件查找的优先级问题比较有帮助。 -iprefix prefix -iwithprefix dir 这两个参数一起用,在-I目录寻找失败的时候,到prefix的dir下查找头文件。 -nostdinc 编译器不再系统缺省的头文件目录里面找头文件。这样就可以精确地确定头文件的来源,应该比较慎用,在对编译器不是很了解的情况下容易造成编译失败 -nostdinc C++ 不在g++的标准路径中找头文件,但在其他的路径中继续找。在创lib的时候用。 -C 为了有效的分析程序,有预处理的时候不删除注释信息,与-E一起使用,有利用分析程序的过程。 -M 生成文件的关联的信息,这样就可以知道源代码文件里面关联了哪些它所依赖的头文件。 -MM 同上,但忽略由#include 造成的依赖关系 -MD 跟-M相当,但是输出导入到d文件中,如gcc -MD testc,刚输出的依赖关系存放在testd文件里。 -MMD 跟-MM相同,但是输出到d文件中,如gcc -MMD testc,刚输出的依赖关系存放在testd文件里。忽略#include 的关系 -Wa,option 这个参数将option传给汇编程序,如果option中有逗号,则会把option分成多项,传给汇编程序。 -Wl,option 这个参数将option传给连接程序,如果option中有逗号,则会把option分成多项,传给连接程序。 -llibrary 用于制定编译的时候使用的库,如 gcc -lgtk tsetc则程序使用gtk库进行编译,不过需要注意的是gcc库一般都是以libnamea来命名库文件,在用-l参数来加入库文件的时候,直接用-lname来引入,而前面的lib被省掉。这一点需要注意。 -Ldir 编译的时候设定库文件查找的路径,不然的话,编译器只在标准库路径里面找库。 -00 -01 -02 -03 编译器的优化选项,-00表示没有优化,-01为缺省值,-03为最高。 -g 在编译的时候,产生调试信息 -gstabs 以stabs格式声称调试信息,但不包括gdb的调试信息。 -gstabs+ 以stabs格式声称调试信息,包括gdb的调试信息。 -ggdb 该参数将把gdb的调试信息输出 -static 这个参数将禁止使用动态库,这样程序只能连接静态库。 -share 这个参数将让程序尽量使用动态库 -traditional 试图让编译器支持传统的C语言的特性 三总结 gcc的参数还远远多于上面写到的这些,但是有以上的参数我们已经可以对gcc的大部分编译掌握的比较熟练了,更多的参数介绍可以参照GCC的manual,现在已有翻译了的中文手册,地址在下面的参考文献里面被列出,有兴趣的朋友可以参考。~
当我们给
$ gcc -o fooo fooc
gcc怎么知道去哪里找fooc里面所include的header文件,连结数据库与系统定义呢 总共有下列来源指定gcc去那找。
当初在编译时指定的(在~gcc/gcc/collect2c:locatelib()
写在specs内的
后来用-D -I -L指定的
gcc环境变量设定(编译的时候)
ldso的环境变量(这是run time的时候)
在
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/295/
里面有个很重要的specs这个档案 gcc根据这个档,做一些内定的动作。 通常系统上的specs内定装起来是在
/usr/lib/gcc-lib/xxxx-gnulibc/version/
specs档看起来是像这样
asm:
%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,} %{Yd,} %{Wa,:%}
asm_final:
%|
cpp:
%(cpp_cpu) %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:
-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
cc1:
%(cc1_cpu) %{profile:-p}
cc1plus:
endfile:
%{!shared:crtendo%s} %{shared:crtendSo%s} crtno%s
link:
-m elf_i386 %{shared:-shared} %{!shared: %{!ibcs: %{!static:
%{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker
/lib/ld-linuxso2}} %{static:-static}}}
lib:
%{shared: -lc --version-script libgccmap%s} %{!shared: %{mieee-fp:-lieee}
%{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}}
libgcc:
-lgcc
startfile:
%{!shared: %{pg:gcrt1o%s} %{!pg:%{p:gcrt1o%s} %{!p:%{profile:gcrt1o%s}
%{!profile:crt1o%s}}}} crtio%s %{!shared:crtbegino%s}
%{shared:crtbeginSo%s}
switches_need_spaces:
signed_char:
%{funsigned-char:-D__CHAR_UNSIGNED__}
predefines:
-D__ELF__ -Dunix -Di386 -D__i386__ -Dlinux -Asystem(posix)
cross_compile:
0
version:
egcs-29166
multilib:
;
multilib_defaults:
multilib_extra:
multilib_matches:
linker:
collect2
cpp_cpu_default:
-D__tune_i386__
cpp_cpu:
-Asystem(unix) -Acpu(i386) -Amachine(i386) %{!ansi:-Di386}
-D__i386 -D__i386__ %{march=i486:-D__i486 -D__i486__}
%{march=pentium|march=i586:-D__pentium -D__pentium__ }
%{march=pentiumpro|march=i686:-D__pentiumpro -D__pentiumpro__ }
%{m386|mcpu=i386:-D__tune_i386__ } %{m486|mcpu=i486:-D__tune_i486__ }
%{mpentium|mcpu=pentium|mcpu=i586:-D__tune_pentium__ }
%{mpentiumpro|mcpu=pentiumpro|mcpu=i686:-D__tune_pentiumpro__ }
%{!mcpu:%{!m386:%{!m486:%{!mpentium:%(cpp_cpu_default)}}}}
cc1_cpu:
%{!mcpu: %{m386:-mcpu=i386} %{mno-486:-mcpu=i386 -march=i386}
%{m486:-mcpu=i486} %{mno-386:-mcpu=i486 -march=i486}
%{mno-pentium:-mcpu=i486 -march=i486} %{mpentium:-mcpu=pentium}
%{mno-pentiumpro:-mcpu=pentium} %{mpentiumpro:-mcpu=pentiumpro}}
在shell下用这行,-E 表示只做到preprocess就好
$ echo 'main(){}' | gcc -E -v -
你会看到gcc去读specs档
Reading specs from /usr/lib/gcc-lib/i386-linux/2952/specs
gcc version 2952 20000220 (Debian GNU/Linux)
/usr/lib/gcc-lib/i386-linux/2952/cpp -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -
GNU CPP version 2952 20000220 (Debian GNU/Linux) (i386 Linux/ELF)
#include "" search starts here:
#include <> search starts here:
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2952/include
/usr/include
End of search list
The following default directories have been omitted from the search path:
/usr/lib/gcc-lib/i386-linux/2952/////include/g++-3
/usr/lib/gcc-lib/i386-linux/2952/////i386-linux/include
End of omitted list
# 1 ""
main(){}
所以有内定的定义,(就是用在#if defined #ifndef #define这些东西, 如果有定义这个字符串,就去编译等等。) -Dxxxx -Dxxxx -Axxxx。 还有内定的include文件的搜寻路径
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2952/include
/usr/lib/gcc-lib/i386-linux/2952/////include/g++-3
/usr/lib/gcc-lib/i386-linux/2952/////i386-linux/include
但是如果装gcc的时候,是有给定的prefix的话,那么就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/281/include
所以header file的搜寻会从-I开始然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH 再找上述的内定目录
函式库
当我们用到数学函式cos(),cos这个symbol,gcc并不晓它到底是什么东西, 是变量,是函式,要预留多少空间给他等等,完全没有任何讯息,你必须标头 档要#include ,gcc才知道。而且因为specs这个档里面只有要 link -lc也就是只有libcso这个档内的symbol会被搜寻, 像printf scanf等都在这里面,可是像cos()等就没有了, 所以函式库的选项要多加 -lm ,这时ld才会来找libm这个函式库,
编译的时候,gcc会去找-L,再找gcc的环境变量LIBRARY_PATH,再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的, gcc环境变量与pass给ld的机制在~gcc/gcc/collect2c下找得到。 这上面只是搜寻路径而已,如果要不加-lm 也能正确的主动搜寻某个特定的lib,例如libm, 就要去在specs这个档案改一下,把math这个函式库加进自动联结函式库 之一。就不用写-lm了。
RUN TIME的时候, 如果编译时没有指定-static这个选项,其实可执行文件并不是真的可执行, 它必须在执行(run time)时需要ldso来做最后的连结动作,建造一个可执行的 image丢到内存。如果是静态连结,编译时ld会去找libma的档 。如果是动态连结去找libmso。 所以每次有新改版程序, 或新加动态函式库如果不在原本的/etc/ldsoconf搜寻路径中,都要把路径 加进来,然后用
ldconfig -v
会重建cache并且显示它所参照的函式库。Run Time时ldso才找得到lib"执行"。 ld与ldso不一样喔。
一些重要的程序
ld :Link Editor 连结各obj写进一个可执行档(executable)。
ldd :秀出一个执行文件用了那些动态函式库。
ldso :Dynamic Linker, 动态连结的话,是由ldso完成执行时期symbol的
:参照与连结。
ld-linuxso :ELF文件的动态连结,跟ldso一样。只是ldso是给aout format的。
:新的glicb2的ld-linuxso2已经跟ldso2结合成单一程序了。
ldconfig :根据/etc/ldsoconf内的目录,做出动态连结所需的cache档。
ld 就是负责各个函式库文件的信息写进最后可执行档(executable),所以它叫做 link editor,编译时根据flags -L搜寻需要的lib,gcc也会把他的设定pass下来。 ldso ld-linuxso2是负责最后动态连结,叫做dynamic linker, RUN Time 执行程序时,它根据这个顺序搜寻函式库。
LD_LIBRARY_PATH 或LD_AOUT_LIBRARY_PATH环境变量所指的路径
ldconfig所建立的cache
/lib /usr/lib内的档
来找程序所需要的动态函式库
ldconfig会根据/etc/ldsoconf这个档的设定,加上内定的两个目录 /lib /usr/lib来设定ldso要用到所需要的连结 以及连结的cache到/etc/ldsocache。 所以如果换了新的函式库,新的kernel,内部的标头档可能会有变化, 都要跟着改变让gcc正确的找到,喔不,应该是cpp, ld, ldso能正确的找到。 不然编出来的执行档可能是错误的,执行时还可能segmentation fault。
gcCp云查是一款供用户在线查询国内外公司信息的工具,可以查询公司的基本信息、股东信息、经营范围、信用状况等。当使用gcCp云查时,如果输入的公司名称或关键词不被系统匹配,就会出现“未匹配项”的提示。
出现“未匹配项”提示的原因可能有以下几种:
1 公司名称输入错误:如果输入的公司名称存在拼写错误或其他错误,就会导致系统无法匹配,出现“未匹配项”的提示。
2 公司信息不在数据库中:如果查询的公司信息不在gcCp云查的数据库中,就无法匹配,也会出现“未匹配项”的提示。
3 系统故障:如果gcCp云查系统出现故障或其他技术问题,也可能导致无法匹配,出现“未匹配项”的提示。
如果出现“未匹配项”的提示,建议您再次确认输入的公司名称是否正确,如有错误请进行更正。如果输入正确但仍无法匹配,可能是因为该公司信息不在gcCp云查的数据库中,建议您尝试其他查询工具。如果是系统故障导致的问题,建议您稍后再试或联系gcCp云查客服进行反馈。
# yum-y install binutilsx86_64 \
compat-libcap1x86_64\
compat-libstdc++x86_64\
compat-libstdc++i686\
gccx86_64\
gcc-c++x86_64\
glibci686\
glibcx86_64\
glibc-develx86_64\
glibc-develi686\
kshx86_64\
libgcci686\
libgccx86_64\
libstdc++x86_64\
libstdc++i686\
libstdc++-develx86_64\
libstdc++-develi686\
libaiox86_64\
libaioi686\
libaio-develx86_64\
libaio-develi686\
makeel6\
sysstatx86_64\
lrzszx86_64
注:最后一个lrzsz是一个上传和下载(rz,sz)命令需要的工具,但是速度不如ssh shell快,所以可不选。
安装Oracle
1.上面的创建oracle用户和路径等基本配置信息已经执行
2. 将下载的oracle安装包上传,用root用户复制到安装路径,并修改安装包的用户和组为oracle:oinstall(视个人创建的用户和组为准),切换到oracle用户,解压安装包
3.Oracle安装程序进行一半时,会有一个检查安装条件的过程,其中会有提示很多的包(部分已经安装,但是版本过高)没有安装,如下图:
安装命令:(直接粘贴即可)
# yuminstall libaioi686 libaiox86_64 libaio-develi686 libaio-develx86_64 compat-libstdc++-33i686compat-libstdc++-33x86_64 elfutils-libelf-develi686 elfutils-libelf-develx86_64 libstdc++i686 libstdc++x86_64 unixODBCi686 unixODBCx86_64 unixODBC-develi686 unixODBC-develx86_64
注意:安装这些包后,oracle安装程序再次检查时,还会有不满条件的安装包,
进入安装程序即可。
这样的删除应该不会影响使用的,如果影响的不多,你可以在使用的时候再安装,但如果影响的多可能就要重新安装了。
记得:千万不要使用apt-get autoremove等类似自动清理工具,除非你确定删除的是不用的。
以上就是关于请问如何用C语言动态为数据库添加一个表全部的内容,包括:请问如何用C语言动态为数据库添加一个表、请问为什么我在用gcc编译c语言写的一个小程序时不能使用“wall”参数、gcc 在编译时如何去寻找所需要的头文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)