undefined reference的问题(同时链接静态,动态库可能导致的问题)
项目中,往往会同时链接 .a
文件和 .so
文件,当项目比较庞大的时候,就会出现很难保证 .a
文件的链接顺序的情况,由于.a
文件对链接顺序有较高的要求,所以可能会出现即使指定了相应的 .a
文件,那么链接器有的时候也无法正确链接,即会出现:undefined reference
解决的方法有几种:
全部链接静态库,并严格保证依赖顺序
全部链接动态库
保证混合链接的情况,调整编译指令
静态库链接顺序必须严格保证「先用到符号的,后提供符号的」,但在多个 .a
时,有时链接器只扫一遍,不会再次回头扫描,当依赖的文件过多时,很难手动保证顺序,所以推荐使用下面的方法:
target_link_libraries(project_name"-Wl,--start-group"zstd::libzstd_static# other .a or .solibrdkafkaSasl2::Sasl2"-Wl,--end-group"
)
这样就可以强制linker在 --start-group
和 --end-group
之间进行多次扫描,从而规避这个问题。