cmake Poco 靜態庫鏈結出錯問題小結

2021-06-09 15:28:51 字數 1723 閱讀 8912

問題是這樣的我在專案中一直使用的是動態庫. cmakelist.txt 中動態庫鏈結選項如下:

target_link_libraries(vhost libpocofoundationd.so libpoconetd.so libpocoutild.so libpoconetssld.so libpocodatamysqld.so  libboost_filesystem.so libboost_system.so libboost_date_time.so)

專案ok,可我想把它換成靜態庫照貓畫虎如下:(直接把.so改為.a)

target_link_libraries(vhost libpocofoundationd.a libpoconetd.a libpocoutild.a libpoconetssld.a libpocodatamysqld.a  libboost_filesystem.a libboost_system.a libboost_date_time.a)

結果有n個錯誤.一時頭都大了..

why?????

錯誤太多了例如:

undefined reference to `__syscall_error

undefined reference to `pthread_mutexattr_init'

沒辦法這樣找下去太慢了boss會打我的頭打暴的..

換個方式, 靜態和動態混編. 先把前面的1個庫改為靜態的

target_link_libraries(vhost libpocofoundationd.so libpoconetd.so libpocoutild.so libpoconetssld.so libpocodatamysqld.so  libboost_filesystem.so libboost_system.solibboost_date_time.a)

成功了.

慢慢的再把第二個也改為.a 第三個 第四個...

直到它出現了類似這樣的錯誤:

/poco-1.4.3p1-all/util/src/loggingconfigurator.cpp:157: undefined reference to `poco::loggingfactory::defaultfactory()'

/poco-1.4.3p1-all/util/src/loggingconfigurator.cpp:157: undefined reference to `poco::loggingfactory::createchannel(std::basic_string, std::allocator> const&) const'

target_link_libraries(vhost libpocofoundationd.so libpoconetd.so libpocoutild.a libpoconetssld.a libpocodatamysqld.so  libboost_filesystem.a libboost_system.a libboost_date_time.a)

這個錯誤是找不到定義也就是說找不到相對應的.a或者.so檔案. 這個定義在 util 這個庫中. 問題是你明明在target_link_libraries有這個.a的庫它卻提示你沒有. 問題在於先後順序.

你調整一下就ok了.

例如:libpoconetd.a 依賴 libpocoutild.a 

你不能把 libpocoutild.a 寫到 libpoconetd.a 的前面. 否則他就會找不到定義.

得把libpocoutild.a 寫到libpoconetd.a 的後面.

靜態庫鏈結

所有的編譯系統都提供一種機制,將所有相關的目標模組打包成為乙個單獨的檔案,成為靜態庫它可以用作鏈結器的輸入。當鏈結器構造乙個輸出的可執行檔案時,它只複製靜態庫里被應用程式引用的目標模組。這裡我們要用到三個簡單的c語言程式addvec.c multvec.c和main2.c。int addcnt 0 ...

靜態庫鏈結

在一般的情況下,一種語言的開發環境往往會附帶有語言庫 language library 這些庫就是對作業系統的api的包裝。其實乙個靜態庫可以簡單地看成一組目標檔案的集合,即很多目標檔案經過壓縮打包後形成的乙個檔案。我們知道在乙個c語言的執行庫中,包含了很多跟系統功能相關的 比如輸入輸出 檔案操作 ...

靜態庫,靜態鏈結,動態鏈結 的區別

遺憾地說 除了ender說的 靜態庫在程式執行時就會裝入記憶體,而動態庫在呼叫的時候才裝入!是正確的外,其他觀點都有偏頗之處甚至是錯誤的。我的感覺是,大家受mfc的影響太深了,而沒有看到事情的本質。首先糾正所謂 靜態連線就是把需要的庫函式放進你的exe之中 的說法。在真實世界中,有三個概念 use ...