C++02:构建并使用共享库

本文介绍了一个简单的共享库的编写与使用流程,包括源代码编写、共享库编译及测试程序的编译和运行步骤。同时针对运行时加载共享库失败的问题,提供了多种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、编写共享库源代码

假定以下源文件的路径为: /users/kwarph/say_hello/src
假定共享库存放的路径为: /users/kwarph/say_hello/bin

1,头文件 cpp02.h
/*
 * cpp02.h
 *
 */

#ifndef CPP02_H_
#define CPP02_H_

#include <string>

class cpp02 {
public:
    cpp02();
    cpp02(const std::string& name);

    void hello() const;

    std::string who() const;
    void who(std::string& name);

private:
    std::string who_;
};

#endif /* CPP02_H_ */
2,实现文件 cpp02.cpp
/*
 * cpp02.cpp
 *
 */

#include <iostream>

#include "cpp02.h"

cpp02::cpp02() {
}

cpp02::cpp02(const std::string& name) :
    who_(name) {
}

void cpp02::hello() const {
    std::cout << "Welcome to XuanYuan Open Lab, " << (who_ == "" ? "my friend"
            : who_) << "!\n";
}

std::string cpp02::who() const {
    return who_;
}

void cpp02::who(std::string& name) {
    who_ = name;
}
3,编译共享库
$ cd /users/kwarph/say_hello/bin
$ g++ -O0 -g3 -Wall -c -o"cpp02.o" "../src/cpp02.cpp"       #注意:是Debug版本,开启了-g3选项
$ g++ -shared -o"libsay_hello.so" cpp02.o

二、调用libsay_hello.so

假定测试代码的路径:/users/kwarph/test_say_hello/src
假定测试程序的路径:/users/kwarph/test_say_hello/bin

1,测试代码
/*
 * cpp03.cpp
 *
 */

#include "cpp02.h"

int main() {
    cpp02 c("bill joy");
    c.hello();
}
2,编译测试代码
$ cd /users/kwarph/test_say_hello/bin
$ g++ -I"/users/kwarph/say_hello/src" -O0 -g3 -Wall -c -o"cpp03.o" "../src/cpp03.cpp"  # -I 指定所需的头文件所在路径
$ g++ -L"/users/kwarph/say_hello/bin" -o"cpp03" cpp03.o -lsay_hello   # -L 指定共享库所在的路径
3,运行测试程序 cpp03
$ ./cpp03

 注意:如上方式执行,会报如下错误:

/users/kwarph/test_say_hello/bin/cpp03: error while loading shared libraries: libsay_hello.so: cannot open shared object file: No such file or directory

 说明cpp03在运行期无法找到动态库: libsay_hello.so,这个问题可以通过以下几个途径解决

  • libsay_hello.so复制到 /usr/lib 或 /usr/local/lib(需要root权限)
  • 在 /usr/lib 或 /usr/local/lib 下创建 对libsay_hello.so的 链接(使用命令 ln)(需要root权限)
  • 在shell终端:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/users/kwarph/say_hello/bin (不需root权限,但只在当前的终端会话期间有效)
  • 将 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/users/kwarph/say_hello/bin 添加到~/.bash_profile (假定使用的shell是bash,不需root权限)

 重新执行cpp03

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/users/kwarph/say_hello/bin
$ ./cpp03
$ Welcome to XuanYuan Open Lab, bill joy!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值