网站建设网页设计小江wordpress重写插件
news/
2025/9/25 20:43:37/
文章来源:
网站建设网页设计小江,wordpress重写插件,卖网站链接,自已建网站卖东西要多少钱上篇文章《C自动注册的工厂与--whole-archive》提到了--whole-archive选项在自动工厂示例的必要#xff0c;“貌似也没其他方法了”。 这篇文章介绍另一种可以替代的方式#xff0c;并分析其优缺点#xff0c;采用的代码示例同上篇文章。文章最后附代码。 方法介绍 ld链接器… 上篇文章《C自动注册的工厂与--whole-archive》提到了--whole-archive选项在自动工厂示例的必要“貌似也没其他方法了”。 这篇文章介绍另一种可以替代的方式并分析其优缺点采用的代码示例同上篇文章。文章最后附代码。 方法介绍 ld链接器提供了另外一组选项解决符号依赖的问题。 -u symbol
--undefinedsymbol 上面的选项用来告诉链接器symbol符号在最终的输出文件里是未定义的需要从其他模块拉进去。 这样我们就可以指定依赖的符号让链接器强制将pay_handler.cpp生成的目标文件链接到可执行文件。 怎么找符号 由于C允许函数重载函数名不具有唯一性编译器需要对名字进行改编也就是name mangling。所以不能简单的将函数名写在链接选项后面需要指定实际改编后的符号。 pay_handler.cpp文件如下 #include msg_handler.h
#include stdio.hclass PayHandler {public:PayHandler() { register_msg_handler(pay, PayHandler::handle);}static bool handle(std::string_view msg_data) {printf(pay handle\n);return true;}
};static PayHandler pay_handler; 假设我们要找handle函数的符号整个流程如下(1)编译pay_handler.cpp为目标文件符号信息都存储在目标文件里 $ g -c pay_handler.cpp (2)使用nm获取所有符号结合grep命令搜索疑似符号 $ nm -g pay_handler.o | grep handleU _Z20register_msg_handlerPKcSt8functionIFbSt17basic_string_viewIcSt11char_traitsIcEEEE
0000000000000000 W _ZN10PayHandler6handleESt17basic_string_viewIcSt11char_traitsIcEE
0000000000000000 W _ZNSt17_Function_handlerIFbSt17basic_string_viewIcSt11char_traitsIcEEEPS4_E10_M_managerERSt9_Any_dataRKS7_St18_Manager_operation
0000000000000000 W _ZNSt17_Function_handlerIFbSt17basic_string_viewIcSt11char_traitsIcEEEPS4_E9_M_invokeERKSt9_Any_dataOS3_ (3)使用cfilt命令还原改编之前的符号确定最终的符号 $ cfilt _ZN10PayHandler6handleESt17basic_string_viewIcSt11char_traitsIcEE
PayHandler::handle(std::basic_string_viewchar, std::char_traitschar ) 最终的CMakeList.txt如下 cmake_minimum_required (VERSION 3.24.0)
project(main)add_library(payhandler STATIC pay_handler.cpp)
add_library(msghandler STATIC msg_handler.cpp)add_executable(${PROJECT_NAME} main.cpp)target_link_libraries(${PROJECT_NAME}msghandlerpayhandler-u_ZN10PayHandler6handleESt17basic_string_viewIcSt11char_traitsIcEE
) 优劣分析 两个方面分析 跨编译器 cmake内置支持--whole-archive所以可以跨编译器而本篇介绍的选项需要指定符号而符号是跟具体编译器相关的所以不具备跨编译器的能力。 对文件大小的影响 --whole-archive会将静态库的所有目标文件链接进来最终的输出文件可能会比较大而本篇介绍的选项则只加载符号所依赖的目标文件。 所以要综合考虑以上两个方面选择适合的选项。 附代码 msg_handler.h #include functional
#include string_viewusing MsgHandler std::functionbool(std::string_view msg_data);// 注册消息处理器
void register_msg_handler(const char *msg_type, MsgHandler handler);// 获取指定消息类型的处理器
MsgHandler* get_msg_handler(const char *msg_type); msg_handler.cpp #include map
#include string#include msg_handler.hstatic std::mapstd::string, MsgHandler get_map() {static std::mapstd::string, MsgHandler map_handlers;return map_handlers;
}void register_msg_handler(const char *msg_type, MsgHandler handler) {get_map()[msg_type] handler;
}MsgHandler* get_msg_handler(const char *msg_type) {auto m get_map();auto it m.find(msg_type);if (it ! m.end()) {return it-second;}else {return nullptr;}
} pay_handler.cpp #include msg_handler.h
#include stdio.hclass PayHandler {public:PayHandler() { register_msg_handler(pay, PayHandler::handle);}static bool handle(std::string_view msg_data) {printf(pay handle\n);return true;}
};static PayHandler pay_handler main.cpp #include msg_handler.h
#include stdio.hint main() {MsgHandler* handle get_msg_handler(pay);if (handle) {(*handle)(test data);}else {printf(not found\n);}return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917501.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!