c++ linker warning: defined in discarded section
c++ linker warning: defined in discarded section。
/usr/bin/ld: .gnu.linkonce.t._zn5boost8signals25slot0ivns_8functionifvveeeed1ev' referenced in section.gnu.linkonce.r._zn5boost8signals25slot0ivns_8functionifvveeeed1ev’ of ./libut_doraemon.a(ut_doraemon_city_id_data_handler.o): defined in discarded section `.gnu.linkonce.t._zn5boost8signals25slot0ivns_8functionifvveeeed1ev’ of ./libut_doraemon.a(ut_doraemon_city_id_data_handler.o)
以上是我遇到的编译warning
经网上搜索发现这是gcc编译器引入后comdat section(或者叫linkonce section)才会出现的。
comdat section简单地说就是编译器将可能存在多处定义的symbol作了一个特殊处理,放到了一个特殊的section,这样多个object文件的comdat section可能保存了同一个symbol的信息,在linker选择symbol进行读取的时候只会选择其中一个section,而丢弃其他secition。
如果由于链接顺序不对,导致引用了不对的section(即被丢弃的那个),就会报这个错。(不同的编译参数可能导致这个问题)
为解决这个问题,需要同一编译参数,并检查链接顺序(按照链接参数从左向右链接)。