1. 程式人生 > >linux 連結 靜態庫 undefined reference to

linux 連結 靜態庫 undefined reference to

最近將專案移植到linux上,工程需要依賴三個靜態庫:libprojcommon.a libluabind.a liblua.a

依賴關係是projcommon依賴luabind,luabind依賴lua,所以專案最終的連結引數是這樣的:

-L/home/boy/ProjCommon/lib -lprojcommon -L/home/boy/luabind/lib -lluabind -L/home/boy/lua/lib -llua

但是連結失敗,報錯

luabind/src/create_class.cpp:36: undefined reference to `lua_pushnil'
luabind/src/create_class.cpp:40: undefined reference to `lua_pushstring'
luabind/src/create_class.cpp:41: undefined reference to `lua_equal'
luabind/src/create_class.cpp:43: undefined reference to `lua_settop'

...

當然這樣的錯誤無窮無盡,很多。

仔細檢查了連結路徑、連結順序、系統預設目錄下是不是存在同名的靜態庫,都不是這些問題,用nm檢視liblua.a,發現匯出的函式名也存在。將Makefile改來改去,還是無解,鬱悶了整整一上午。

最終終於找到原因:liblua是c專案,Makefile是我從libluabind拷過來的,而libluabind是c++專案,在修改編譯目標副檔名.cpp為.c之後,卻忘了將編譯器從g++改為gcc,導致liblua中生成的為C++風格函式名,而libluabind中包含lua標頭檔案有extern "c"的修飾,是按照C風格引用的,兩邊函式名不一致,導致undefined。

編譯liblua時改為用gcc編譯後,問題搞定!

遇到類似的問題,這裡總結一下排錯方法:

1,檢查連結路徑是否正確(當然路徑不正確會報找不到檔案);

2,檢查連結到的庫是不是想連結的目標庫(例如連結到不同版本的同名庫等);

3,確保依賴關係正確,並檢查連結順序;

4,確認庫的原始碼.c或.cpp檔案都被編譯到,而且都被連結進了庫中;

5,用nm檢視庫的匯出函式是否存在;

6,確認庫匯出函式的名稱與引用處的名稱是否一致;

7,其實這一點和第6點原因一致:確認工程是否cpp和c混用,如果是,請確保cpp檔案用c++編譯器編譯,c檔案用c編譯器編譯;

8,如果上述方法還是沒有解決問題,不可能啊!真的這樣的話,就將庫程式碼直接編進工程吧,或者換個庫吧,或者換個Makefile吧(誰知道你寫的Makefile有什麼問題...)

相關推薦

linux 連結 靜態 undefined reference to

最近將專案移植到linux上,工程需要依賴三個靜態庫:libprojcommon.a libluabind.a liblua.a 依賴關係是projcommon依賴luabind,luabind依賴lua,所以專案最終的連結引數是這樣的: -L/home/boy/ProjCommon/lib -lproj

Linux編譯程式報錯 undefined reference to error 的解決方法

對於我這個剛入IT行業不就得新手來說,在linux下連結庫的時候總是會遇到各種各樣奇葩的問題,最多的就是“undefined reference to”和“cannot find”這兩類,層出不窮,總是在我即將完成工作的時候給我當頭一棒,讓我欲罷不能。這不,這幾天編譯linux下一個專案時又遇到難題

Linux 編譯報錯 -- undefined reference to 問題解決方法 (具體'pthread_create'和opencv看文章最後兩條)

最近在Linux下程式設計發現一個詭異的現象,就是在連結一個靜態庫的時候總是報錯,類似下面這樣的錯誤: (.text+0x13): undefined reference to `func'     關於undefined reference這樣的問題,大家其實經常會遇到

Linux 編譯報錯 undefined reference to `pthread_create'

在編譯Linux下多執行緒程式的時候出現錯誤資訊, 寫好程式碼,進行編譯時,出現如下錯誤提示資訊:  thread.c:(.text+0xae): undefined reference to `pthread_create' thread.c:(.

linux安裝QtCreator出現undefined reference to 'drmCloseOnce'

在Jetson tx1 上安裝了ubuntu16.04系統,然後安裝QtCreator時出現undefined reference to `drmCloseOnce`,/usr/lib/aarch64

Linux 編譯報錯 -- undefined reference to 問題解決方法 (具體'pthread_create'和opencv看文章最後兩條)

最近在Linux下程式設計發現一個詭異的現象,就是在連結一個靜態庫的時候總是報錯,類似下面這樣的錯誤: (.text+0x13): undefined reference to `func'     關於undefined reference這樣的問題,大家其實經常會遇

關於Cmake 連結靜態出現undefined reference to錯誤

在編寫一個C++專案的時候,使用cmake管理工程,成功連結一個靜態庫,但是在編譯時仍然出現undefined reference to 的錯誤。 最終發現問題是由於c和c++混編導致的。 解決方案: 由於我連結的庫是使用c語言編寫,所以需要在include標頭檔案時加上 #

linux 連結檔案出現“undefined reference to" 問題的解決方法

最近在Linux下程式設計發現一個詭異的現象,就是在連結一個靜態庫的時候總是報錯,類似下面這樣的錯誤: (.text+0x13): undefined reference to `func'      關於undefined reference這樣的問題,大家其實經常會遇

linux下編譯自己的靜態時依賴其他的動態,使用時出現“undefined reference to

        對於我這個剛入IT行業不就得新手來說,在linux下連結庫的時候總是會遇到各種各樣奇葩的問題,最多的就是“undefined reference to”和“cannot find”這兩類,層出不窮,總是在我即將完成工作的時候給我當頭一棒,讓我欲罷不能。這不,這

Android.mk 連結undefined reference to的錯誤處理

我們在編譯Android JNI的時候,經常要連結一些其他的開源庫,總是會碰到undefined reference to的問題。一般編譯器報 “undefined reference to”的錯誤是以下幾種情況。1 沒有指定對應的庫(.o/.a/.so) 使用了庫中定義的實

靜態呼叫靜態&靜態載入靜態------談談undefined reference to和linker input file unused because linking not done

          靜態庫可以呼叫靜態庫嗎? 靜態庫可以載入靜態庫嗎?  搞清這些東西, 對於linux開發很重要, 本文我們來探討這些問題。           先看程式:           business.h: #include <iostream>

linux下開發,解決cocos2d-x中編譯出現的一個小問題, undefined reference to symbol &#39;pthread_create@@GLIBC_2.2.5&#39;

water span x86 code bject data- ace 技術分享 inux 解決cocos2d-x中編譯出現的一個小問題 對於cocos2d-x 2.×中編譯中,若頭文件裏引入了#include "cocos-ext.h",在進行C++編譯的時候會遇到例

Linux下運行《UNIX環境高級編程》undefined reference to `err_quit 編譯出錯的處理方法

reg init def bre linux tput linux下 pan termios 錯誤信息: : undefined reference to `err_quit‘: undefined reference to `err_sys‘ 解決方法: 因為err

Linux下動態(.so)和靜態(.a) 的區別 Linux下動態(.so)和靜態(.a) 的區別 動態(.so)連結靜態(.a)的情況總結

Linux下動態庫(.so)和靜態庫(.a) 的區別   靜態庫在程式編譯時會被連線到目的碼中,程式執行時將不再需要該靜態庫。編譯之後程式檔案大,但載入快,隔離性也好。 動態庫在程式編譯時並不會被連線到目的碼中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。多個

gcc 在連結相關so或者a檔案時出現 undefined reference to "xxx"

gcc 在連結相關so或者a檔案時出現 undefined reference to "xxx", 首先確認是否有這個xxx介面的真身,然後查明其所在的庫檔案,之後在當前makefile裡新增就行。 可是今天遇到一種特殊情況,在如下的libs後面直接新增libapps_vram.a檔案時

Linux程式設計時使用gcc編譯.c出現以下問題,pthread.c:(.text+0x29): undefined reference to `pthread_create'collect2: err

Linux程式設計時使用gcc編譯.c出現以下問題 client.c:(.text+0x13e): undefined reference to `pthread_create' collect2: ld 返回 1   解決方法如下: 只需在用gcc編譯時加上-pthread選項即

Linuxundefined reference to pthread create 問題解決

                接觸了Linux系統程式設計中的執行緒程式設計模組,可gcc sample.c(習慣把書上的sample程式碼寫進sample.c檔案中)出現“undefined reference to ‘pthread_create’”,所有關於執行緒的函式都會有此錯誤,導致無法編譯通過。

gcc "undefined reference to" 問題解決方法(使用

最近在Linux下程式設計發現一個詭異的現象,就是在連結一個靜態庫的時候總是報錯,類似下面這樣的錯誤: (.text+0x13): undefined reference to `func' 

Android系統編譯so提示error undefined reference to '__android_log_print問題的解決

在系統原始碼的hardware/qcom下增加psam資料夾,編譯原始碼要生成libpsam.so庫,Android.mk內容 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)   LOCAL_MODULE &n

Linux Ubuntu執行執行緒程式出現undefined reference to ‘pthread_create’和undefined reference to ‘pthread_join’錯誤。

Linux Ubuntu執行執行緒程式出現undefined reference to ‘pthread_create’和undefined reference to ‘pthread_join’錯誤。 編寫好執行緒程式碼,進行編譯 gcc xiancheng.c -o xiancheng 出