windows下转至linux下开发初遇问题解决
1、bool类型不是标准c类型
kk.c: In function ‘main’:
kk.c:6: error: ‘bool’ undeclared (first use in this function)
kk.c:6: error: (Each undeclared identifier is reported only once
kk.c:6: error: for each function it appears in.)
kk.c:6: error: expected ‘;’ before ‘bv’
2、在文件内定义了一个gcc编译器未识别的类型
kk.c:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘bv’
说明你在文件内定义了一个类型名为bv的全局变量,而不被编译器识别
GCC命令
1、链接库
如果在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,
这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,
也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,
比如常用的X11的库,它在/usr /X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数
创建库
动态库与静态库都是有.o文件创建的,动态库可以直接由.c生成
静态库 ar crv libxxx.a xxx.o
动态库 gcc -shared xxx.c -o libxxx.so
gcc -shared -fPCI -o libxxx.so xxx.o
-fPCI选项是生成与路径无关的动态库,这样可以达到多进程共享代码的目的,不然的话每个进程都会有一份动态库的copy
5、-include和-I参数
-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I /myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的--cflags参数就是用来生成-I 参数的
6、-O参数
这是一个程序优化参数,一般用-O2就是,用来优化程序用的,比如gcc test.c -O2,优化得到的程序比没优化的要小,执行速度可能也有所提高
7、-shared参数
编译动态库时要用到,比如gcc -shared test.c -o libtest.so
8、几个相关的环境变量
PKG_CONFIG_PATH:用来指定pkg-config用到的pc文件的路径,默认是/usr/lib/pkgconf
ig,pc文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs参数和Cflags参数等等。
CC:用来指定c编译器
CXX:用来指定cxx编译器
LIBS:跟上面的--libs作用差不多
CFLAGS:跟上面的--cflags作用差不多
CC,CXX,LIBS,CFLAGS手动编译时一般用不上,在做configure时有时用到,一般情况
下不用管
环境变量设定方法:export ENV_NAME=xxxxxxxxxxxxxxxxx
env可以查看当前环境变量
windows下转至linux下开发初遇问题解决-编译链接
最新推荐文章于 2025-06-14 08:47:37 发布