学单片机你们有没有学习操作系统啊,分享一个Linux的相关编译命令

2019-07-21 08:32发布

一、编译可执行文件g++ –c Hello.cpp  编译文件,生成目标文件Hello.og++ Hello.o –o a.out  链接并重命名为可执行文件a.outg++ Hello.cc    编译链接一起,生成a.outg++ Hello.cc –o hello 生成a.out并命名为hello二、编译相关选项(1)-c生成.o文件,对代码文件进行预处理、编译和汇编,相当于windows下生成目标文件objg++ -c hello.cpp(2)-I DirPath指定文件查找目录-include file-i file指定包含的文件g++ hello.cpp -include ../include/a.h-I- DirPath就是取消前一个参数的功能,所以一般在-I DirPath之后使用(3)-L LibPath指定链接库的路径-l library-llibrary指定链接库(4)  -g   
在编译的时候,产生调试信息,程序运行时可以dbg调试
(4)-static此选项将禁止使用动态库。优点:程序运行不依赖于其他库缺点:文件比较大gcc test_main.c -static -o test_main -lpthread会发现test_main很大,它已经把各种依赖的东西都包含进来(5) -shared (-G)此选项将尽量使用动态库,为默认选项优点:生成文件比较小缺点:运行时需要系统提供动态库(6)-Wall一般使用该选项,允许发出GCC能够提供的所有有用的警告。也可以用-W{warning}来标记指定的警告。三、静态库和动态库的编译命令1、生成动态库和静态库(1)得到hello.og++ -c hello.cpp(2)得到静态库myhello.aar -cr libmyhello.a hello.o(3)使用静态库g++ -o hello main.c -L. -lmyhello-L.表示静态库位于当前目录下,myhello自动加上lib组成静态库名称libmyhello.a(4)得到动态库myhello.so g++ -fPIC -shared hello.cpp -o libmyhello.so(5)使用动态库动态库的时候和静态库使用一样,唯一值得注意的是当目录中同时存在相同名称的动态库和静态库时,编译的时候优先使用动态库2、fPIC选项加上fPIC选项生成的动态库时位置无关的,可以实现多个进程共享动态库,多个进程引用同一个PIC动态库时,可以共享内存。这一个库在不同进程中的虚拟地址不同,但操作系统显然会把它们映射到同一块物理内存上。不加fPIC,则加载so文件时,需要对代码段引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于这个.so文件代码段和数据段内存映射的位置。可见,这种方式更消耗内存。3、如何解决运行时找不到动态库的问题(1)将动态库添加到系统默认的搜索路径下,如/lib、/usr/lib(2)设置临时动态库路径的环境变量,这种方法设置的是临时的,系统重启之后就没了export LD_LIBRARY_PATH=./取消设置export LD_LIBRARY_PATH=(3)/etc/ld.so.cache中缓存了动态库路径,可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径,然后执行ldconfig命令来改变(4)编译链接添加-WL,-rpath命令选项,将运行时动态库的搜索路径记录在可执行程序中例如,有源文件test.cpp和func.cppg++ -shared -fPIC func.cpp -o libfunc.so编译得到libfunc.so动态库g++ main.cpp -o a.out -L ./ -lfunc编译得到a.out,执行a.out,提示出错ldd查看a.out依赖的动态库,发现libfunc.so找不到g++ main.cpp -o a.out -L ./ -lfunc -WL,-rpath ./编译得到a.out,执行a.out,运行成功,ldd查看a.out依赖的动态库,发现libfunc.so路径正确把a.out和libfunc.so拷贝到任何目录下,都能运行成功
单片机嵌入式Linux的我弄了个群儿一起学习交流    816509137
0条回答

一周热门 更多>