最近一直在写代码,编译,测试,发现很多错误重复碰到,如果不学会总结,实在很难进步。
今天又碰到个undefined symbol的错误:
Syntax error on line 70 of /usr/local/waf/pe/conf/pe.conf: Cannot load /usr/local/waf/pe/modules/mod_autolearn.so into server: /usr/local/waf/pe/modules/mod_autolearn.so: undefined symbol: autolearn_data_queue_create
pe在开启的时候,会去加载动态模块,动态模块在加载初始化的时候会调用自己模块的函数autolearn_data_queue_create,但是在符号表中却找不到这个函数
于是我查了下符号表:
root@waf:/usr/local/waf/pe/modules# nm mod_autolearn.so | grep autolearn_data_queue
U autolearn_data_queue_create
U autolearn_data_queue_destroy
U autolearn_data_queue_start
U autolearn_data_queue_stop
U autolearn_data_queue_writedata
发现,这几个函数我确实在头文件中有声明,当编译链接的时候没有链接进去,但因为是编译成动态库文件,所以没有在编译的时候提示错误,而在运行的时候找不到真正的函数而提示错误。
于是我重新修改mod_autolearn的配置文件,重新编译后,再次执行加载这个动态库,就不会提示错误了,并再去确认了下这个动态库的符号表:
root@freewaf:/usr/local/waf/pe/modules# nm mod_autolearn.so | grep autolearn_data_queue
000000000000eb90 T autolearn_data_queue_create
000000000000eb40 T autolearn_data_queue_destroy
000000000000ea50 T autolearn_data_queue_start
000000000000eac0 T autolearn_data_queue_stop
000000000000ed70 T autolearn_data_queue_writedata
额,不总结就不会成长,加油!