2017-06-15 86 views
0

當試圖編譯和鏈接一個非常簡單的應用程序,依賴第三方庫時,我收到「未定義的引用」錯誤。C/C++鏈接問題與一個非常簡單的設置

我的main.c看起來是這樣的:

#include "ss7cp.h" 

/* 
extern "C" { 
    void EINSS7CpMain_CpInit(void); 
} 
*/ 

int main() { 
    EINSS7CpMain_CpInit(); 
} 

第三方頭文件有:

#if defined (__cplusplus) || defined (c_plusplus) 
extern "C" { 
#endif 

... 

void EINSS7CpMain_CpInit(void); 

這個函數的定義是在一個檔案:

 
$ nm -g /path/to/lib/libsign_64_uthr.a | grep EINSS7CpMain_CpInit 
0000000000005ae0 T EINSS7CpMain_CpInit 
       U EINSS7CpMain_CpInit 
       U EINSS7CpMain_CpInit 

通過上面的「T」,該功能必須在存檔中某個庫的文本/代碼段中定義。

我目前沒有使用的Makefile,但只是想快速完全通過命令行建立這個簡單的應用程序:

 
g++ -I/path/to/include -L/path/to/lib -lsign_64_uthr -D__EXTENSIONS__ -DLINUX main.c 

(文檔告訴我,同時定義__EXTENSIONS__LINUX)。上述其餘部分非常簡單。什麼我得到的是:

 
/tmp/ccvgmIJ8.o: In function `main': 
main.c:(.text+0x5): undefined reference to `EINSS7CpMain_CpInit' 
collect2: error: ld returned 1 exit status 

我都試過爲C文件(main.c中)和C++文件(main.cpp中,使extern "C"塊),但沒有什麼區別。 (我可以假設g ++只是通過文件擴展名來決定C和C++嗎?)

我甚至剛剛編譯了文件(與-c),並查看了生成的main.o對象文件的內容,並看到文本「EINSS7CpMain_CpInit」原樣,沒有問題(或者這可能只是一個調試符號?)

什麼是一些診斷步驟,我可以看看我失蹤了什麼?我是否真的需要創建一個Makefile並拆分編譯和鏈接步驟?

自從我上次做了任何C/C++之後,甚至在我做這件事時甚至回來了,我通常不是必須從頭開始創建Makefiles的人,所以我可能會錯過一些非常基本的東西...

+1

_「我可以假設G ++決定基於C與C++只是通過文件的擴展名?」 _否 –

+0

'nm -u main.o'給了我'U EINSS7CpMain_CpInit',所以我假設這不僅僅是一個名字的破壞問題? –

+0

_「我可以採取哪些診斷步驟」_「nm」告訴您關於鏈接庫中找到的符號的內容? –

回答

2

我最好的猜測是參數排序,的lib應該來源文件後:

g++ -I/path/to/include -D__EXTENSIONS__ -DLINUX main.c -L/path/to/lib -lsign_64_uthr 
+0

是的,就是這樣! –