1. 程式人生 > >檢查靜態庫中的同名函式

檢查靜態庫中的同名函式

靜態庫中可以有同名函式

這種做法肯定不是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的第一個標

OpenCVwatershed函式(分水嶺演算法)的詳細使用例程

#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

stdlibqsort函式的使用

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 ***************