简谈用g++编译运行c++代码流程,以及动态库静态库的创建与使用
来源:互联网 发布:批发购物软件 编辑:程序博客网 时间:2024/06/07 13:48
一 g++ 编译运行hello world
1编写hello world 代码
#include<iostream>using namespace std;int main(){ cout << "hello world!" << endl; return 0;}
2 编译及运行
自动生成了a.out可执行的文件
huxiang@shenyong-Opt790:~/work/cpp$ g++ hello.cpp huxiang@shenyong-Opt790:~/work/cpp$ lsa.out hello.cpphuxiang@shenyong-Opt790:~/work/cpp$ ./a.out hello world!
二 程序运行步骤
预处理 .i .ii文件 gcc -E hello.cpp -o hello.i编译 .s文件 gcc -S hello.cpp -o hello.s汇编 .o .obj文件 gcc -c hello.cpp -o hello.o链接 .lib .a文件
1 预处理
vim hello.i
...上面很长省略了.. extern wostream wclog; static ios_base::Init __ioinit;}# 2 "hello.cpp" 2using namespace std;int main(){ cout << "hello world!" << endl; return 0;}
2 编译
vim hello.s
.file "hello.cpp" .local _ZStL8__ioinit .comm _ZStL8__ioinit,1,1 .section .rodata.LC0: .string "hello world!" .text .globl main .type main, @functionmain:.LFB971: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %esi movl $_ZSt4cout, %edi call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc movl $_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, %esi movq %rax, %rdi
3 汇编
vim hello.o
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ð^A^@^@^@^@^@^@^@^@^@^@@^@^@^@^@^@@^@^O^@^L^@UH<89>å¾^@^@^@^@¿^@^@^@^@è^@^@^@^@¾^@^@^@^@H<89>Çè^@^@^@^@¸^@^@^@^@]ÃUH<89>åH<83>ì^P<89>}ü<89>uø<83>}ü^Au'<81>}øÿÿ^@^@u^^¿^@^@^@^@è^@^@^@^@º^@^@^@^@¾^@^@^@^@¿^@^@^@^@è^@^@^@^@ÉÃUH<89>å¾ÿÿ^@^@¿^A^@^@^@è°ÿÿÿ]Ãhello world!^@^@^@^@^@^@^@^@^@^@^@^@GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4^@^@^@^@^@^T^@^@^@^@^@^@^@^AzR^@^Ax^P^A^[^L^G^H<90>^A^@^@^\^@^@^@^\^@^@^@^@^@^@^@'^@^@^@^@A^N^P<86>^BC^M^Fb^L^G^H^@^@^@^\^@^@^@<^@^@^@^@^@^@^@=^@^@^@^@A^N^P<86>^BC^M^Fx^L^G^H^@^@^@^\^@^@
4 链接
三 多文件编译链接
1 编写add.h add.cpp main.cpp代码
add.h 头文件
#ifndef _ADD_H#define _ADD_Hextern int add(int a,int b);//extern 表示函数实现在另一个文件中#endif~
add.cpp 函数实现
int add(int a,int b){ return (a+b);}
main.cpp main函数
#include<iostream>#include"add.h"using namespace std;int main(){ int a = 1,b = 2; int c = add(a,b); cout << a << " + " << b << " = " << c << endl; return 0;}
2 编译运行
huxiang@shenyong-Opt790:~/work/cpp$ g++ add.h add.cpp main.cpp -o mainhuxiang@shenyong-Opt790:~/work/cpp$ lsadd.cpp add.h main main.cpphuxiang@shenyong-Opt790:~/work/cpp$ ./main 1 + 2 = 3
四 动态库与静态库
静态库 .a (linux) .lib (windows)
动态库 .so (linux) .dll (windows)
gcc时,用-I和-L分别制定库名和库路径
1 静态库的创建与使用
- 1 创建add.c和add.h,其中main函数中用到了add这个函数,如果直接运行会报错说找不到add这个函数。
- 2 先add.c编译成二进制文件add.o
g++ -c add.c -o add.o- 3 再用ar这个工具将add.o做成静态库
ar -r libadd.a add.o- 4 这样就可以调用了,即在编译的时候加上库的名字,路径并申明为静态库-static等参数即可。
g++ mian.c -ladd -L/home/huxiang/work/cpp -static -o main- 5 注意要其他地方也要用的话要把add.h也拷贝过去才能用
huxiang@hp:~/work/cpp$ lsadd.c add.h add.o a.out mian.chuxiang@hp:~/work/cpp$ rm a.out huxiang@hp:~/work/cpp$ ar -r libadd.a add.o ar: creating libadd.ahuxiang@hp:~/work/cpp$ lsadd.c add.h add.o libadd.a mian.chuxiang@hp:~/work/cpp$ g++ mian.c -llibadd -L./ -static -o main/usr/bin/ld: cannot find -llibaddcollect2: error: ld returned 1 exit statushuxiang@hp:~/work/cpp$ g++ mian.c -libadd -L./ -static -o main/usr/bin/ld: cannot find -libaddcollect2: error: ld returned 1 exit statushuxiang@hp:~/work/cpp$ pwd/home/huxiang/work/cpphuxiang@hp:~/work/cpp$ g++ mian.c -libadd -L/home/huxiang/work/cpp -static -o main/usr/bin/ld: cannot find -libaddcollect2: error: ld returned 1 exit statushuxiang@hp:~/work/cpp$ g++ mian.c -ladd -L/home/huxiang/work/cpp -static -o mainhuxiang@hp:~/work/cpp$ lsadd.c add.h add.o libadd.a main mian.chuxiang@hp:~/work/cpp$ ./main 1+2=3
其他地方也要用的话
huxiang@hp:~/work$ lsadd.h cpp mian.chuxiang@hp:~/work$ g++ mian.c -ladd -L./cpp -static -o mainhuxiang@hp:~/work$ lsadd.h cpp main mian.chuxiang@hp:~/work$ ./main 1+2=3
2 动态函数库的建立与使用
- 1.首先创建libmyadd.so,即利用add.c这个函数生成动态库
g++ -share -fPIC -o libmyadd.so add.c
-share指为共享的,-fPIC表示position independent code位置无关,这是动态库特性- 2.指定动态库生成可执行文件,-L.表示当前文件夹,-lmyadd表示去找libmyadd.so这个动态库文件。
g++ main.c -L. -lmyadd- 3.直接使用会抱错,找不到动态库,要指定动态库的路径
./a.out会报错
LD_LIBRARY_PATH=. ./a.out指定当前库的路径后在运行就可以了- 4.如果要一直用,可以将.so文件的目录添加到/etc/ld.so.conf里面,然后再执行ldconfig就行了,具体如下面:
huxiang@hp:~/work/cpp$ lsadd.c add.h add.o main.chuxiang@hp:~/work/cpp$ g++ -share -fPIC -o libmyadd.so add.cg++: error: unrecognized command line option ‘-share’huxiang@hp:~/work/cpp$ g++ -shared -fPIC -o libmyadd.so add.chuxiang@hp:~/work/cpp$ lsadd.c add.h add.o libmyadd.so main.chuxiang@hp:~/work/cpp$ g++ main.c -L. -lmyaddhuxiang@hp:~/work/cpp$ lsadd.c add.h add.o a.out libmyadd.so main.chuxiang@hp:~/work/cpp$ ./a.out ./a.out: error while loading shared libraries: libmyadd.so: cannot open shared object file: No such file or directoryhuxiang@hp:~/work/cpp$ LD_LIBRARY_PATH=. ./a.out1+2=3
如果要永久使用的话该怎么办呢?
huxiang@hp:~/work/cpp$ lsadd.c add.h add.o a.out libmyadd.so main.chuxiang@hp:~/work/cpp$ ./a.out 这里直接用会报错./a.out: error while loading shared libraries: libmyadd.so: cannot open shared object file: No such file or directoryhuxiang@hp:~/work/cpp$ vi /etc/ld.so.conf 在这个文件里面添加.so所在的目录就行了huxiang@hp:~/work/cpp$ pwd/home/huxiang/work/cpphuxiang@hp:~/work/cpp$ vi /etc/ld.so.confhuxiang@hp:~/work/cpp$ sudo ldconfighuxiang@hp:~/work/cpp$ ./a.out 1+2=3
例如,我的添加后的ld.so.conf文件就是这个样子:
include /etc/ld.so.conf.d/*.conf/home/huxiang/work/cpp
参考:
http://blog.csdn.net/xiahouzuoxin/article/details/25481023
http://www.cnblogs.com/jiqingwu/p/linux_dynamic_lib_create.html
0 0
- 简谈用g++编译运行c++代码流程,以及动态库静态库的创建与使用
- g++ 编译链接C++代码, 生成与使用静态库和动态库
- g++ 编译链接C++代码, 生成与使用静态库和动态库
- 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用
- 简单静态库与动态库的创建以及Makefile基本使用
- G++编译:动态链接库的链接与使用
- Linux下g++编译与使用静态库和动态库
- Linux下g++编译与使用静态库和动态库
- Linux下g++编译与使用静态库和动态库
- Linux下g++编译与使用静态库和动态库
- G++ 编译使用动态链接库和静态链接库
- qt动态库与静态库编译、应用以及pri文件创建
- qt动态库与静态库编译、应用以及pri文件创建
- 静态库与动态库的创建与使用
- 静态库与动态库的创建与使用
- c语言中静态库动态库的创建与使用
- 在linux下,创建和使用C/C++的静态与动态库
- 编译OpenSSL 动态库/静态库以及运行时库的选择
- 词法分析与正则表达式(三)
- project_workflow_02
- ZXing 粗暴修改扫描范围及截图范围
- 修改系统默认语言
- 简单编程题目连载(三)
- 简谈用g++编译运行c++代码流程,以及动态库静态库的创建与使用
- 更新的macOS Sierra系统后怎么在隐私中找回允许任何来源
- js表单验证
- unity笔记-20170113
- MySQL入门之时间相关函数
- 欢迎使用CSDN-markdown编辑器
- python 输入与输出
- 基于CDH5.4.5(ha)的Hbase 3节点搭建
- 请问 linux下怎样把几个静态库(libabc.a...)编译成一个动态库(libtest.so)