靜態庫中可以有同名函數
這種做法肯定不是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
不能省略。