静态库中可以有同名函数
这种做法肯定不是bad practice。但是误操作可能导致这个问题的出现。
可以通过C++的namespace来解决这个问题。不过我不写C++,那么忽略它。
例子test.h
:
#include <stdio.h>
void play();
test.c
void play() {
printf("play\n");
}
test_old.c
void play(){
printf("old play\n");
}
以上三个文件编译成一个静态库:
set(LIB_SRC "test.c test_old.c")
add_library(mytest STATIC ${LIB_SRC})
完整demo工程见replicated_symbols_in_static_lib
检查静态库中同名函数的方法
假设这里编译出来的静态库是libmytest.a
方法1:利用二进制工具查看
利用nm或者objdump,结合grep/sort/uniq工具。
nm libmytest.a | grep -P "^[^\\s]+ T " | cut -d' ' -f3 | sort | uniq -d
得到“重名”函数。
objdump -S -C libmytest.a
得到所有symbol
方法2:让链接器抛出错误
比如gcc搭配的连接器ld,接受的参数--no-whole-archive
可以检查出来重复的symbol。
具体到CMake构建的项目中,则将原来的:
target_link_libraries(main mytest)
修改为:
set(MYLIB -Wl,--whole-archive mytest -Wl,--no-whole-archive)
target_link_libraries(main ${MYLIB})
其中-Wl
用来标志“后面的flags是给ld的而不是gcc的”,因为gcc不接受ld的flags所以-Wl
不能省略。