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

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

There are no translations available.

一、编写共享库源代码

假定以下源文件的路径为: /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!

Contact Us

Hotline: (0) 189 1267 1348

Online Contact (QQ)

2371765294 张老师 1197961893 吴老师
570508473 张老师

Login