當試圖編譯和鏈接一個非常簡單的應用程序,依賴第三方庫時,我收到「未定義的引用」錯誤。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的人,所以我可能會錯過一些非常基本的東西...
_「我可以假設G ++決定基於C與C++只是通過文件的擴展名?」 _否 –
'nm -u main.o'給了我'U EINSS7CpMain_CpInit',所以我假設這不僅僅是一個名字的破壞問題? –
_「我可以採取哪些診斷步驟」_「nm」告訴您關於鏈接庫中找到的符號的內容? –