檢查靜態庫中的同名函式
靜態庫中可以有同名函式
這種做法肯定不是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})
檢查靜態庫中同名函式的方法
假設這裡編譯出來的靜態庫是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
不能省略。
參考
相關推薦
檢查靜態庫中的同名函式
靜態庫中可以有同名函式 這種做法肯定不是bad practice。但是誤操作可能導致這個問題的出現。 可以通過C++的namespace來解決這個問題。不過我不寫C++,那麼忽略它。 例子 test.h: #include <stdio.h> void play(); test.c void pl
使用objdump檢視動態庫和靜態庫中具有哪些函式
我們在 Linux 下執行一個程式,有時會無法啟動,報缺少某某庫。這時需要檢視可執行程式或者動態庫中的符號表,動態庫的依賴項, Linux 有現成的工具可用:objdump 。 objdump 是 gcc 套件中用來檢視 ELF 檔案的工具,具體詳細用法不進行介紹,此
plist文件無法打包進.a靜態庫中
新建 null 進制 rac 是否 想法 dsm back lis 問題: 之前一直在做靜態庫的編寫與維護,也一直知道靜態庫的圖片資源是沒辦法打進.a中的。可是突然有個想法。由於有非常多參數的配置是在一個plist文件裏的。盡管也知道這是一個plist文件,可是想
obj檔案打包為靜態庫,靜態庫中抽取obj檔案
0.前言: 嘗試製作ida FLIRT簽名檔案,需要從lib檔案中抽取obj檔案,於是順帶著把生成lib檔案的命令也看了一邊。雖然我知道不會有人傻兮兮的放著IDE不用,而用命令列來生成庫檔案。 1.準備環境: 安裝vc++6.0並進入編譯器安裝目錄下"VC98\Bin"子目
C++中派生類重寫基類過載函式時需要注意的問題:派生類函式遮蔽基類中同名函式
派生類可以繼承基類中的非私有函式成員,當然也就可以繼承其中非私有的被過載的函式。如下: 【參考程式碼】 class Base { public: void print() { cout << "print() in Base." <<
C語言標準庫中round函式
本文轉自---http://demon.tw/programming/c-round.html C語言標準庫中有沒有round函式?答案是,可能有,也可能沒有。這取決於你使用的編譯器,更準確地說,是編輯器是否支援C99標準。 讓我們簡單回顧一下C語言標準的歷史:C的第一個標
OpenCV庫中watershed函式(分水嶺演算法)的詳細使用例程
#include <iostream> #include <opencv2\opencv.hpp> using namespace std; using namespace cv; Mat srcImage, srcImage_, maskImage; Mat maskWaterS
Linux的nm檢視動態和靜態庫中的符號
功能 列出.o .a .so中的符號資訊,包括諸如符號的值,符號型別及符號名稱等。所謂符號,通常指定義出的函式,全域性變數等等。 使用 nm [option(s)] [file(s)] 有用的options: -A 在每個符號資訊的前面列印所在物件檔名稱;-C
MFC的使用——在共享DLL中使用MFC、在靜態庫中使用MFC
前言 我們在使用Microsoft Visual Studio軟體(也就是我們常常說的VS)時,其中專案屬性中有一項叫做“MFC的使用”,裡面包含有不同的設定,會影響我們所編寫的程式的使用,今天我就遇到了這個情況,我們一起來總結一下,避免犯下相同的錯誤。 內
C++標準庫中排序函式sort的用法
(一)為什麼要用c++標準庫裡的排序函式 Sort()函式是c++一種排序方法之一,學會了這種方法也打消我學習c++以來使用的氣泡排序和選擇排序所帶來的執行效率不高的問題!因為它使用的排序方法是類似於快排的方法,時間複雜度為n*log2(n),執行效率較高! (二)c++標準庫裡的排序函式的使用方法 I)S
stdlib庫中qsort函式的使用
qsort :功 能: 使用快速排序例程進行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各引數:1 待排序陣列
如何使用gcc檢查動態庫中符號的完整性
Check out the linker option "-z defs" / "--no-undefined". When creating a shared object, it will cause the link to fail if there are unr
VS2015及VS2017組合語言呼叫C語言的stdio庫中的函式
眾所周知,VS可以用來寫組合語言,同樣的在組合語言中,我們可以呼叫C語言中的函式,前提我們需要知道呼叫的函式在哪裡。例如下面這一段程式碼:;//VS15/17 Template for Win32 Console Application.686.MODEL flat, std
iOS靜態庫中慎重使用Category擴充套件方法(selector not recongized)
事情背景這個坑是前幾天踩的,踩的還特別是時候專案馬上要發版了,發給測試做最後的驗證,測試反饋從log上面看有點詭異,有些手機可以有些手機不可以。因為提測前我是做過自測的,我相信應該沒有問題,一同和測試一起繼續測試,發現還是有些手機可以有些手機不可以。這麼奇怪的問題讓我很懵逼呀。按照常理來說應該是要不可以就都不
檢查靜態庫是否支援bitcode
蘋果在 Xcode 7 中引入了 bitcode,在打包提交時,會包含 bitcode。如果專案用到了以二進位制格式釋出的第三方庫,第三方庫也需要包含 bitcode 才行。如果沒有包含 bitcode,編譯時會報錯,除非手動關閉 bitcode 特性。 除了
【轉】關於Python查詢庫中的函式方式
首先開啟命令列輸入: python -m pydoc -p 1234ython -m pydoc表示開啟pydoc模組,這個模組就是用來檢視python文件的工具-p 1234表示在埠號1234上開啟server,這個埠號可以自行設定原文地址:https://blog.csd
VS2013中編譯專案在靜態庫中使用MFC出現錯誤的解決方法
前言 由於需要將VS2013環境下編譯的程式考給沒有安裝VS2013環境的電腦中使用,解決方式有3種,colorfulpieces部落格中有介紹。 1. 採用靜態編譯 2. 將mfc100.dll和應用程式一起打包釋出 3. 將程式和vcredist20
C語言中呼叫靜態庫函式和動態庫函式的方式
C語言中呼叫動態庫函式的兩種方式 方式一.隱式呼叫 將動態庫的相關檔案拷貝到當前目錄下(lib、dll),然後新增以下程式碼,在程式中指定連線庫函式。 注意:第二個引數給出的是引入庫檔案(或稱“匯出庫檔案”),而不是dll。在程式執行過程中,lib將dll中需要用到的函式對映到對應的記憶
VS編譯linux項目生成靜態庫並在另一個項目中靜態鏈接的方法
能夠 決定 遠程 isp 讓我 comm 位置 編寫 none VS2017也推出很久了,在單位的時候寫linux的服務端程序只能用vim,這讓用慣了IDE的我很難受。 加上想自己擼一套linux上的輪子,決定用VS開工遠程編寫調試linux程序。 在windows下編
如何檢查mysql數據庫中mysql復制是否正常工作?
mysql數據庫 數據庫管理員 數據庫工程師 數據庫開發 通過在slave上執行show slave status來檢查復制是否正常工作mysql> SHOW SLAVE STATUS\G*************************** 1. row ***************