簡體   English   中英

在編譯過程中鏈接有關boost靜態庫的錯誤“ undefined reference”

[英]Linking error “undefined reference” about boost static library during compiling

我正在嘗試使用Boost庫1.57在Linux x64上編譯我的C ++項目。

該項目使用scons編譯,我在Arch Linux上成功編譯了該項目,但是這次在Ubuntu計算機上失敗了。

我添加了-lboost_coroutine標志以進行鏈接,但錯誤“未定義的引用”仍然存在。

/usr/bin/g++ -o build/gcc.release/app -pthread -g
build/gcc.release/src/han/unity/rpcx.o 
-lpthread -lz -lboost_coroutine -lboost_context -lboost_date_time 
build/gcc.release/src/han/unity/rpcx.o: In function `attributes':
/usr/local/include/boost/coroutine/attributes.hpp:31: undefined reference 
to `boost::coroutines::stack_traits::default_size()'

我注意到attributes.hpp正是增強協程頭文件之一。 我嘗試使用nm來增強協程庫,這似乎沒有問題。

nm /usr/local/lib/libboost_coroutine.a | grep "default_size"
0000000000000170 T _ZN5boost10coroutines12stack_traits12default_sizeEv

我搜索了此錯誤的可能原因,其中大多數與鏈接器標志的順序有關。 在這種情況下,rpcx.o取決於boost_coroutine,因此它出現在前面。

還有什么可能的原因?

經過幾個小時的努力,我終於解決了。

原來那是仍然存在的舊boost(v1.55)庫,它具有與我手動安裝的boost庫(v1.57)相同名稱的靜態庫。 鏈接器在v1.57之前找到了v1.55靜態庫,因此它使用這些庫進行鏈接。 但是,在舊版本中,仍未引入函數boost::coroutines::stack_traits::default_size() ,這使鏈接器無法找到此函數的正確位置,並返回“未定義引用”。

對於那些偶然在編譯過程中通過搜索“未定義的引用”錯誤而發現此問題的人,我采取了一些有關調試此類問題的步驟,並在此處提供您的信息。

  1. 檢查鏈接的庫是否在/usr/lib//usr/local/lib/ ,如果不存在,請嘗試首先安裝它們。

  2. 檢查是否為引用的庫添加了正確的鏈接標志。 例如,如果您使用boost_coroutine庫,請確保在鏈接期間添加-lboost_coroutine

  3. 檢查鏈接標志的順序是否正確(對於gcc)。 這可能是大多數情況下的原因。 如果B依賴於A,請確保將B放在A的前面。

  4. 檢查同一庫是否存在不同版本。

我希望這些可以有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM