一、编写共享库源代码
假定以下源文件的路径为: /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!