linux下gcc/g++创建一个共享库项目以及创建一个可执行项目动态链接该共享库

发布时间 2023-08-19 10:02:33作者: Silentdoer

1.先确保有g++命令

2.创建一个c++项目目录,并cd到该目录

3.创建共享库头文件:dynamic_so.h

#ifndef __TEST__
#define __TEST__

int testFun(int a, int b);

#endif

4.创建对应共享库的实现文件:dynamic_so.cpp

#include "dynamic_so.h"

int testFun(int a, int b)
{
    return a + b;
}

5.编译共享库:g++ dynamic_so.cpp -fPIC -shared -o libtest.so
此时可以看到在项目根目录下多了一个叫libtest.so的文件,这里注意,共享库要以lib开头.so结尾

 

6.开始写主程序:main.cpp

#include <iostream>
#include "dynamic_so.h"

using namespace std;

int main()
{
    cout << testFun(10, 20) << endl;

    return 0;
}

可以看到这个程序也引用了这个头文件,用于后面代码编写不会报错

7.编译成可执行文件main:g++ main.cpp -L. -ltest -o main【这里的-ltest的test就是上面的共享库去掉前缀lib和后缀.so的名字,最后的main就是可执行文件名】
可以看到在项目根目录下也多出了一个main文件

8.执行main文件:./main会发现找不到动态链接库,我们用ldd main会发现libtest.so链接的是not found

解决方式为将libtest.so放到公共目录,比如/usr/lib目录下,这个时候再用ldd main就可以看到libtest.so是链接的/usr/lib/libtest.so了

此时再执行就会输出30;

 

9.如果想编译时就让main可以从程序所在目录(而非工作目录)里搜索libtest.so呢?可以这么编译:g++ main.cpp -L. -Wl,-z,origin -Wl,-rpath='$ORIGIN' -ltest -o main
此时ldd main可以看到libtest.so链接的就是main文件当前所在目录的libtest.so文件;

还可以切换到上一层用./cpp_test/main来执行一下,发现确实可以输出30

10.如果是希望libtest.so链接的是main文件同级目录下的lib目录里的libtest.so文件呢?可以这样写:g++ main.cpp -L. -Wl,-z,origin -Wl,-rpath='$ORIGIN/lib' -ltest -o main

这种情况下,编译要求libtest.so在main.cpp所在目录,但是执行main时要求libtest.so在main所在目录的lib目录下;