本文共 5006 字,大约阅读时间需要 16 分钟。
/Users/luogw/CLionProjects/untitled2/cmake-build-debug/untitled2construct, call ResManger() // 库的全局变量construct, call GlobalClass()2construct, call GlobalClass()call main()Hello, World! // 库的hello函数的输出construct, call CommonClass()register atexitnext line call exit(0)atexit callback, lambda expressionatexit callback, beforeExitF()destruct, call ~GlobalClass()destruct, call ~GlobalClass()2destruct, call ~ResManger()Process finished with exit code 0
对应的可执行程序的源代码如下
#include#include #include "lib/include/library.h"using namespace std;class GlobalClass {public: GlobalClass() { cout << "construct, call GlobalClass()" << endl; } ~GlobalClass() { cout << "destruct, call ~GlobalClass()" << endl; }};class GlobalClass2 {public: GlobalClass2() { cout << "construct, call GlobalClass()2" << endl; } ~GlobalClass2() { cout << "destruct, call ~GlobalClass()2" << endl; }};class CommonClass {public: CommonClass() { cout << "construct, call CommonClass()" << endl; } ~CommonClass() { cout << "destruct, call ~CommonClass()" << endl; }};//全局对象GlobalClass2 G_Class2;GlobalClass G_Class;void beforeExitF() { cout << "atexit callback, beforeExitF()" << endl;}int main() { cout << "call main()" << endl; // 调用动态库的方法 hello(); CommonClass commonClass; cout << "register atexit" << endl; //注册应用退出时的回调方法 atexit(beforeExitF); //注删应用退出前的回调lamdba表达式 atexit([] { cout << "atexit callback, lambda expression" << endl; }); //ateixt是FILO的原侧,先进后出,即后注册的先执行 cout << "next line call exit(0)" << endl; /* * 这时调exit提前结束了进程,所以CommonClass的析构方法不会调到,因为main没有执行return,即main没有出栈 * exit跟return的区别,具体看这里的讨认 https://www.zhihu.com/question/26591968 */ exit(0);// return 0;}
#ifndef UNTITLED1_LIBRARY_H#define UNTITLED1_LIBRARY_Hvoid hello();#endif //UNTITLED1_LIBRARY_H
library.cpp
#include "library.h"#includeusing namespace std;class ResManger {public: ResManger() { cout << "construct, call ResManger()" << endl; } ~ResManger() { cout << "destruct, call ~ResManger()" << endl; }};ResManger resManger;void hello() { std::cout << "Hello, World!" << std::endl;}
CMakeLists.txt
cmake_minimum_required(VERSION 3.17)project(untitled1)set(CMAKE_CXX_STANDARD 14)add_library(untitled1 SHARED library.cpp library.h)
其它的默认配置,可以用otool来看一下动态库使用时的路径配置情况
$ otool -L cmake-build-debug/libuntitled1.dylib cmake-build-debug/libuntitled1.dylib: @rpath/libuntitled1.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 904.4.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)
#include#include #include "lib/include/library.h"using namespace std;class GlobalClass {public: GlobalClass() { cout << "construct, call GlobalClass()" << endl; } ~GlobalClass() { cout << "destruct, call ~GlobalClass()" << endl; }};class GlobalClass2 {public: GlobalClass2() { cout << "construct, call GlobalClass()2" << endl; } ~GlobalClass2() { cout << "destruct, call ~GlobalClass()2" << endl; }};class CommonClass {public: CommonClass() { cout << "construct, call CommonClass()" << endl; } ~CommonClass() { cout << "destruct, call ~CommonClass()" << endl; }};//全局对象GlobalClass2 G_Class2;GlobalClass G_Class;void beforeExitF() { cout << "atexit callback, beforeExitF()" << endl;}int main() { cout << "call main()" << endl; // 调用动态库的方法 hello(); CommonClass commonClass; cout << "register atexit" << endl; //注册应用退出时的回调方法 atexit(beforeExitF); //注删应用退出前的回调lamdba表达式 atexit([] { cout << "atexit callback, lambda expression" << endl; }); //ateixt是FILO的原侧,先进后出,即后注册的先执行 cout << "next line call exit(0)" << endl; /* * 这时调exit提前结束了进程,所以CommonClass的析构方法不会调到,因为main没有执行return,即main没有出栈 * exit跟return的区别,具体看这里的讨认 https://www.zhihu.com/question/26591968 */ exit(0);// return 0;}
CMakeLists.txt
cmake_minimum_required(VERSION 3.17)project(untitled2)set(CMAKE_CXX_STANDARD 14)//添加动态库链接的路径link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/lib/libuntitled1.dylib")add_executable(untitled2 main.cpp)
用otool查看可执行程序依赖的动态库的路径如下
注:默认链接了绝对路径# luogw @ ericluodeMacBook-Pro in ~/CLionProjects/untitled2 [17:13:12] $ otool -l cmake-build-debug/untitled2 | grep path name @rpath/libuntitled1.dylib (offset 24) path /Users/luogw/CLionProjects/untitled2/lib (offset 12)
转载地址:http://pumbi.baihongyu.com/