Makefile学习笔记06|编译动态链接库

Makefile学习笔记06|编译动态链接库,第1张

Makefile学习笔记06|编译动态链接库

  希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。

  这里是目录

  动态链接库,就是程序在运行的时候再去加载的代码。因此,在编译时也与一般的代码不同。编译动态链接库涉及到库文件的路径和加载。

编译选项
  • -fPIC
  • -shared
 g++ -shared -fPIC mylib.cpp -o libmylib.so
 g++ test.cpp -lmylib -L/root/cpp
 #!/bin/sh
 LD_LIBRARY_PATH=./;
 export LD_LIBRARY_PATH
 ./testjin't
静态库

  动态库链接时,只会将动态库中函数的地址链接过来,具体的二进制代码不会复制。静态库与动态库相比,特点在于,静态库编译时需要把所有的源码拷贝到执行程序当中。相比之下,动态库更能缩小项目的体积。编译静态库时有两个常用的可选参数和一个必选参数。

选项描述
[c]不显示创建
[v]显示过程
r创建静态库
项目结构

  总项目下分三个子项目,分别为xserver、xthread、xcom。

项目名称路径文件输出
xserver~/make/src/xserverxserver.cpp、makefilexserver
xthread~/make/src/xthreadxthread.h、xthread.cpp、makefilelibxthread.so
xcom~/make/src/xcomxcom.h、xcom.cpp、makefilelibxcom.a
XThread
// xthread.h
#ifndef XTHREAD_H
#define XTHREAD_H
#include 
class XThread
{
public:
	virtual void Start();
	virtual void Wait();
private:
	virtual void Main()=0;
	std::thread th_;
};
#endif
// xthread.cpp
#include "xthread.h"
#include 
using namespace std;
void XThread::Start()
{
	cout<<"Start Thread"<<endl;
	th_ = std::thread(&XThread::Main, this);
}
void XThread::Wait()
{
	cout<<"begin Wait Thread"<<endl;
	th_.join();
	cout<<"end Wait Thread"<<endl;
}
# makefile
TARGET=libxthread.so
OBJS=xthread.o
LDFALGS=-shared
CXXFLAGS=-fPIC
$(TARGET):$(OBJS)
	$(CXX) $(LDFLAGS) $^ -O $@
clean:
    $(RM) $(TARGET) $(OBJS)
    
.PHONY: clean

  make后可生成libxthread.so。

xesrver
#include 
#include "xthread.h"
using namespace std;
class XTask:public XThread
{
public:
	void Main() override
	{
		cout<<"XTask main"<<endl;
	}
};
int main(int argc, char *argv[])
{
	cout<<"XServer"<<endl;
	XTask task;
	task.Start();
	task.Wait();
	return 0;
}
TARGET=xserver
OBJS=xserver.o
CXXFLAGS=-I../xthread
LDFLAGS=-L../xthread
LIBS=-lxthread -lpthread
$(TARGET):$(OBJS)
	$(CXX) $^ -o $@ $(LDFLAGS) $(LIBS)
clean:
	$(RM) $(TARGET) $(OBJS)

  make一下,没有出错,因为在程序运行时才会去寻找动态链接库。接下来运行程序:./xserver。结果出错:./xserver: error while loading shared libraries: libxthread.so: cannot open shared object file: No such file or directory。原因是之前的makefile中虽然指明了动态链接库的路径,但那只是在编译时将动态链接库的路径告知了make。make按照路径找到了动态链接库,并将函数的地址编译进了可执行文件中。程序执行时只有函数的地址却不知道动态链接库文件也就是.so文件的路径,故而报错。简言之就是,makefile只管编译,不管运行。为了解决这一问题,暂且编写一个shell脚本run来应付一下,后面会优化的。

# run
# 手动设定一下路径
LD_LIBRARY_PATH=../xthread
export LD_LIBRARY_PATH
./xserver
# 加上可执行权限
sudo chmod +x run
./run

  这样就可以正确运行了。
  都看到这里了,可以给个点赞或者评论吗?达瓦里希( ̄^ ̄)ゞ

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/788919.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存