Linux C++编译及 静态/动态 链接库 笔记

阅读更多
1、C++文件的编译
g++参数介绍(非常棒~)
http://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html
官方文档: https://gcc.gnu.org/onlinedocs/
官方参数大全(gcc5.3): https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Option-Summary.html#Option-Summary


-E  预处理, 将#include的文件展开等
-S 生成 汇编文件
-c  生成 object文件
gcc XX.o  -o XX   链接,,输出文件名为XX

-O1,  -O2,  -O3  优化代码 ,-O3级别最高,   -O1为默认
-g 及   -ggdb  等,,生成 调试信息

-fPIC 及 -fpic ,  生成 动态链接库时使用,, 前者在多平台通用,但程序运行速度慢

-M ,  -MM,   输出 文件的 依赖关系(比如各种.h)文件(写makefile时可以使用)

-std=c++14(或-std=gnu++14)  -std=c++11(或-std=gnu++11)启用 c++14/11的信息,其中使用gnu++14会启用gcc的扩展  :
https://gcc.gnu.org/projects/cxx0x.html
https://gcc.gnu.org/projects/cxx1y.html


一般直接用-c 生成object文件,再多个object文件链接一下即可
或者不指定参数,直接从 多个.cpp 文件生成可执行文件

-Wall  输出尽可能多的警告

-I 头文件路径
-L 库文件路径(静态、动态)
-l 库文件(无需包含扩展名.so 或.a ) (但是我自己在Ubuntu14.04.1中直接使用XX.so即可,而不是-lXX.so)



2、静态链接库、动态链接库的编译
Program Library HOWTO: http://www.dwheeler.com/program-library/

C++ dlopen mini HOWTO http://www.tldp.org/HOWTO/C++-dlopen/
这篇文章中讲了由于C++的Name Mangling,,需要 extern "C"等封装才能正常使用fopen函数调用C++函数的问题

很多网上的教程会用到 -l 选项指定库文件!!!但是我试的时候直接指定库文件全名就行!!!(具体见makefile内容)


nm  查看exe、.o、.so、 .a文件中的符号信息,比如C++函数名被编译器 mangle之后的名称

nm XX.so | c++filt  可以查看函数的 原始名称
关于mangling更多请参见 http://blog.csdn.net/chenxintao/article/details/7585483

关于库文件搜索路径的问题,没详细实验,在Ubuntu下貌似当前路径也可以~ 这个,用到再试了
只是简单记一下LD_LIBRARY_PATH 的修改方式:http://baike.baidu.com/view/1270749.htm

不多说了,上代码(完整代码见 附件):

库文件
#pragma once
int plus(int a,int b);


#include "sharedLib.h"
int plus(int a,int b){
	return a+b;
}


采用静态链接库

你可能感兴趣的:(linux,c++)