linux程序的链接,Linux下C++程序编译链接的学习例子

main代码如下:

#include "B.h"

#include

using namespace std;

int main (int argc, char *argv[])

{

B objB;

int result = objB.func(1, 2);

cout << "result = " << result << endl;

}

libA代码如下:

/**

*********A.cpp************

*/

#include "A.h"

#include

using namespace std;

A::A()

{

cout << "A ctor" << endl;

}

A::~A()

{

cout << "A dtor" << endl;

}

int A::func(int x, int y)

{

return (x + y) * 2;

}

/**

*********A.h************

*/

#ifndef _A_H_

#define _A_H_

#include "ADll.h"

class LIBA_API A {

public:

A();

~A();

int func(int x, int y);

};

#endif

libB代码如下:

/**

*******************B.cpp********************

*/

#include "B.h"

#include "A.h"

#include

using namespace std;

class BImpl {

public:

BImpl() {};

~BImpl() {};

int func(int x, int y){

return objA.func(x, y);

}

private:

A objA;

};

B::B() : _impl(new BImpl)

{

cout << "B ctor" << endl;

}

B::~B()

{

cout << "B dtor" << endl;

delete _impl;

}

int B::func(int x, int y){

return _impl->func(x, y);

}

/**

************B.h*******************

*/

#ifndef _B_H_

#define _B_H_

#include "BDll.h"

class BImpl;

class LIBB_API B {

public:

B();

~B();

int func(int x, int y);

private:

BImpl *_impl;

};

#endif

以libA下的makefile为例学习makefile:

CXX= g++ #编译器

AR= ar # 对.o文件进行归档,生成库

CXXFLAGS = -shared -g -Wall -fPIC -std=c++11 -I./ #g++参数:-shared 调用动态库 -g 可执行程序包含调试信息 -Wall 编译后显示所有警告 -fPIC 真正的共享.so -std=c++11 支持c++11标准; -I 后跟头文件地址

LDFLAGS = -L./ # 库文件地址 ### -Wl,-rpath=your_lib_dir 只有-L选项时有可能编译通过但是执行时not found 库,因为-L只有编译时有效,可以通过加上此命令记住链接库的位置;

SRCS = $(wildcard *.cpp) # wildcard 函数,展开所有的.cpp文件

OBJS = $(patsubst %.cpp, %.o, $(SRCS)) patsubst函数 将.cpp全部替换成.o并返回,等于objs等于.cpp编译的.o文件

$(info SRCS = $(SRCS))

$(info OBJS = $(OBJS)) # info make的打印函数

TARGET= libA.so libA.a # 编译目标

OUTPUT= ../output #输出位置

all: clean $(TARGET) install copy2B # 让所有的操作顺次执行,

.PHONY: clean install copy2B #因为make的规则是 目标 :依赖 ,当 main : main.c 时,为了从依赖获取目标,就会执行之后的规则;

#但是当clean:后没有依赖时,make会认为依旧获取到目标,因此不再执行clean后的规则,

#用.PHONY关键字,意为欺骗make,clean目标还未达成,即会执行clean之后的规则;

# 目标 : 依赖

# 规则

.cpp.o: #自动将.cpp识别为源文件后缀,.o识别为目标文件后缀; g++ -c 将.cpp编译成.o ,而不是可执行

@echo "\ncompile..."

$(CXX) -c $< -o $@ -DLIBA_API_EXPORTS $(CXXFLAGS) # $@目标文件 $^所有的依赖文件 $

$(TARGET): $(OBJS) # .o到.so .a

$(CXX) $^ -o $@ $(CXXFLAGS) $(LDFLAGS) #g++生成动态库 gcc -fPIC -shard -o 目标 源文件 gcc -c -fPIC *.c gcc -shared -o *.so *.o

$(AR) -crsv libA.a $^ # ar 创建静态库 -c 禁止再创建库的文件时产生的正常信息 -r 如果已存在,则替换 -s 无论是否修改了库的内容,强制生成库符号表 其余命令可查找学习

install:

@echo "\ninstall to output..."

cp A.h ADll.h $(OUTPUT)/include # cp 移动

cp -a $(TARGET) ${OUTPUT}/lib/linux

clean:

@echo "\nclean..."

rm -rf $(TARGET) *.o #清除中间文件

copy2B:

@echo "\ncopy to libB..."

cp ../output/include/*../../libB/include

cp ../output/lib/linux/*../../libB/lib/linux

现在已经学会了简单的makefile文件编写,接下来就可以进行实践尝试了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值