c語言重寫函數編譯靜態庫
① 請教高手教一下用gcc編譯c語言函數,再合並為靜態庫,最後調用的過程。
應該編譯成.a文件
ar rc c:\libab.a c:\a.o c:\b.o
然後,再編譯執行文件
gcc -o c:\m.exe c:\m.c -LC:\ -lab
你這樣試試
② C語言中如何將自己常用的函數封裝到編譯器的庫函數中具體應該怎麼做呢
用編譯器提供的庫管理工具。
C語言的編譯器都會提供一個命令行工具,可以把自己編譯後的.obj模塊加入指定的庫文件,以後使用時只需要連接該庫文件即可。這個命令行工具通常是lib.exe,用這個工具可以查看庫中的模塊,可以把模塊加入到庫中,可以從庫中刪除模塊。這個工具不僅僅是自己建立的庫文件的管理工具,可以管理所有的庫文件,包括C語言提供的標准庫。
③ 我用c語言寫了兩個函數,怎麼把它變成c的庫函數隨時調用求解釋!
改成。h 放到庫文件里
調用函數時 包含這個。h文件即可
④ C語言里如何編譯庫函數最好舉例,詳細點的!
太長了發2部分給你ok學習任何知識,循序漸進總是最好的方式。不幸的是,很多人明知這個道理,卻總是想走所謂的捷徑。如果你是一個剛剛開始學習編程的中學生,或者你是一個剛剛進入計算機學院的本科生,又或者你是一個決心在計算機領域有所建樹的初學者,你一定迫切地想知道,學習計算機技術,究竟應該從哪裡下手。 我的建議是:數學、英語、C語言。 為什麼C語言如此重要?我們從學習方法開始說起。書本上描述的東西,倘若不經過我們的親自實踐,是難以被徹底消化吸收的。計算機組成原理講解了浮點數的格式,如果我們能看到並分析內存或寄存器中某個浮點數的表示,那比單純的紙上談兵要強一千倍;數據結構與演算法似乎很難,如果你能把書上的例子實現出來,然後把習題做完,只需啃完一本好書,你也可以是演算法高手;操作系統原理其實不僅僅是原理,只有做一些內核方面的實驗才能真正有深刻理解;還有許多新潮的技術,比如JavaEE、PHP、Ajax、.NET等等等等,很多高手學習這些技術只需要很短的時間,不必說,他們肯定是C語言的高手。C語言幾乎是一切計算機技術的通用工具,包括計算機的各種基本理論。沒有精通C語言的決心,就不要涉足計算機領域。 為什麼是C語言而不是C++不是Java不是其它?因為C語言最簡單。你需要掌握一個語言工具,但也許並不需要「面向對象」、「模板」、「函數重載」等等一大堆概念。C語言足夠低級,非常非常地貼近計算機的底層結構,不會讓你迷失在概念的汪洋大海。除了「指針」,C語言沒有真正意義上的難點,而「指針」,恰恰是理解計算機底層結構精髓的關鍵所在 所以,初學者們不必思考應該學什麼,等把C語言精通了,你自己便會知道下一步如何去走。如果你對操作系統內部感興趣,你便可以試著研究一下Unix的內核,除了C語言,你還需要一些匯編語言和保護模式的知識;如果你對演算法感興趣,那麼恭喜你,C語言足夠使用了;如果你對Windows編程感興趣,去看看《Windows程序設計》吧,作者清楚的告訴你「只需要C語言的基礎」;如果你對任何其它語言感興趣,盡管去學吧,不過還是建議先學C++,因為你需要一些「面向對象」的知識。 一、要讀就讀好書,否則不如不讀 大名鼎鼎的譚浩強教授出了一本《C語言程序設計》,據說發行量有超過400萬,據我所知,很多學校都會推薦這本書作為C語言課本。雖然本人的名字(譚浩宇)跟教授僅僅一字之差,但我是無比堅定地黑他這本書的。這本書不是寫給計算機專業的學生的,而是給那些需要考計算機等級考試的其它專業學生看的。這本書的主要缺點是:例子程序非常不專業,不能教給你程序設計應該掌握的思考方式;程序風格相當地不好,會讓你養成亂寫代碼的惡習;錯誤太多,曾經有人指出過這本書的上百個錯誤,其中不乏關鍵的概念性錯誤。好了,這本書我也不想說太多了,有興趣大家可以網路一下。 Kernighan和Ritchie的《The C Programming Language》(中譯名《C程序設計語言》)堪稱經典中的經典,不過舊版的很多內容都已過時,和現在的標准C語言相去甚遠,大家一定要看最新的版本,否則不如不看。另外,即使是最經典最權威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊》是十分必要的。《C語言參考手冊》就是《C Reference Manual》,是C語言標準的詳細描述,包括絕大多數C標准庫函數的細節,算得上是最好的標准C語言的工具書。順便提一句,最新的《C程序設計語言》是根據C89標准修訂的,而《C語言參考手冊》描述的是C99標准,二者可能會有些出入,建議按照C99標准學習。還有一本《C和指針》,寫得也是相當地不錯,英文名是《Pointers on C》,特別地強調指針的重要性,算是本書的一個特點吧。不過這本書並不十分適合初學者,如果你曾經學過C語言,有那麼一些C語言的基礎但又不是很扎實,那麼你可以嘗試一下這本書。我相信,只要你理解了指針,C語言便不再神秘。 如果你已經啃完了一本C語言教材,想要更進一步,那麼有兩本書你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊子,內容非常非常地有趣。要注意一點,這本書是二十多年前寫成的,裡面提到的很多C語言的缺陷都已被改進,不過能夠了解一些歷史也不是什麼壞事。
⑤ C語言為什麼可以重寫標准庫函數
這個問題是一個好問題,我之前也沒思索過或者嘗試過,
首先我們弄清楚一件事,函數聲明可以放在任何頭文件,實現可以放在任何實現該函數的源文件中,那麼就存在一個問題:
編譯時,到底優先去使用哪一個,為什麼沒有把標准庫中的函數擴展過來;在windows下標准庫被編譯成了msvcr120.dll(msvcr100.dll,這里指release版),所以並不是擴展到代碼中,而是在調用時動態鏈接;
而題主在其中自定義文件中實現了該函數,所以編譯時找到了該函數的實現,並不會去鏈接dll(這應該是編譯器做的一些工作,確定系統的dll需要載入哪些),所以題主的程序執行時就只有一份fputc了,並不沖突。
題主可以通過快捷鍵跳轉聲明就知道了,VS下,點選fputc實現函數按F12跳轉到聲明,指向的是stdio.h,再按一次跳轉到你自己的定義了。Qt的話使用F2。
大概就是這樣子了,可追問。
⑥ C語言編譯問題 靜態鏈接
鏈接靜態庫的意思就是在編譯階段需要將靜態庫鏈接到工程中,這樣在編譯時程序才不會出錯,在用到靜態庫的函數時能夠找到函數的實現,如果沒有鏈接靜態庫則編譯時會報錯。
這里需要區分的就是鏈接動態庫與靜態庫的區別,你可以到網上找一些資料看看。
而且鏈接靜態庫是將整個庫文件都導入到了工程中,所以會增加工程的大小。
⑦ 在C語言中,如何將用戶自定義函數變成庫函數(.h)文件
除了樓上兩位說的,還要把頭文件放在你的編譯環境中設置的include directory中,比如,一般會放在main的文件所在的目錄。
⑧ 哪位大神能用c語言 重寫opencv 的下面6個函數或者從源碼中整理出來,可以編譯,運行
去git上面看看源碼
//先說一下這個函數吧
//cvNamedWindow
CV_IMPLintcvNamedWindow(constchar*name,intflags){
CV_FUNCNAME("cvNamedWindow");
if(!name)CV_ERROR(CV_StsNullPtr,"NULLname");
HighguiBridge::getInstance().namedWindow(name);
returnCV_OK;
}
//而它又需要HighhuiBridge這個類,它有個單例工廠方法
HighguiBridge&HighguiBridge::getInstance(){
staticHighguiBridgeinstance;
returninstance;
}
//上面2個函數實際調用這2個成員函數
CvWindow*HighguiBridge::namedWindow(cv::Stringname){
CvWindow*window=HighguiBridge::getInstance().findWindowByName(name.c_str());
if(!window)window=createWindow(name);
returnwindow;
}
//創建窗口先是查找有沒有已有窗口
CvWindow*HighguiBridge::findWindowByName(cv::Stringname){
autosearch=windowsMap->find(name);
if(search!=windowsMap->end())returnsearch->second;
returnnullptr;
}
//如果沒有會用這個函數創建
CvWindow*HighguiBridge::createWindow(cv::Stringname){
CvWindow*window=newCvWindow(name);
windowsMap->insert(std::pair<cv::String,CvWindow*>(name,window));
returnwindow;
}
//創建窗口是CvWindow類
classCvWindow{
public:
CvWindow(cv::Stringname,intflag=CV_WINDOW_NORMAL);
~CvWindow();
/**@briefNOTE:prototype.
.
*/
voidcreateButton(cv::Stringname);
/**@.
.
*/
voidcreateSlider(cv::Stringname,int*val,intcount,CvTrackbarCallback2on_notify,void*userdata);
/**@briefUpdateswindowimage.
@.
Thefunctionupdateswindowimage.-doesnothing.
*/
voipdateImage(CvMat*arr);
/**@(slider).
@paramnameNameofthewindow.
(slider).
nullptr.
*/
CvTrackbar*findTrackbarByName(cv::Stringname);
Page^getPage();
private:
cv::Stringname;
//HoldsimagedatainCVformat
CvMat*imageData;
//
std::map<cv::String,CvTrackbar*>*sliderMap;
//Windowcontentsholder
Page^page;
//
Image^imageControl;
//Containerforsliders
Panel^sliderPanel;
//Containerforbuttons
//TODO:prototype,notavailableviaAPI
Panel^buttonPanel;
//.
//RequiredsinceimageData->
intimageWidth;
//t
staticconstPlatform::String^markupContent;
//DefaultSlidersize,
;
};
//CvWindwo構造函數為
CvWindow::CvWindow(cv::Stringname,intflags):name(name){
this->page=(Page^)Windows::UI::Xaml::Markup::XamlReader::Load(const_cast<Platform::String^>(markupContent));
this->sliderMap=newstd::map<cv::String,CvTrackbar*>();
sliderPanel=(Panel^)page->FindName("cvTrackbar");
imageControl=(Image^)page->FindName("cvImage");
buttonPanel=(Panel^)page->FindName("cvButton");
//.
//,afterthatwecan
//updateothercontrols
imageControl->Loaded+=refnewWindows::UI::Xaml::RoutedEventHandler(
[=](Platform::Object^sender,
Windows::UI::Xaml::RoutedEventArgs^e){
//
for(autoiter=sliderMap->begin();iter!=sliderMap->end();++iter){
iter->second->getSlider()->Width=imageControl->ActualWidth;
}
//
//TODO:implementwhenaddingbuttons
});
}
⑨ 如何將c語言的math.h編譯為靜態庫在mcu上使用
庫函數的源碼你是看不到的。要找實現的話得去網路。自帶的都是編譯好的東西(用到時直接調用)不是原C程序。
至於sin()的實現。如果你學過高數應該知道泰勒展開。
不知道的話直接給你公式:sin(x)=x-(x^3)/3!+(x^5)/5!+...(按這規律求和下去,x是弧度)
用一個for循環。要精確的話循環的次數多些就行
⑩ 怎樣用C語言重寫FILE的庫函數,比如重寫fopen(),fgetc(),fclose(),fseek(),printf().
這最好找個專業的,一般人是沒辦法寫的,一是難度大,二是這么費事沒報酬也不好找著
找網路能找著無疑是大海撈針,最好去專業點的平台去找