//[root@ ~/learn_code/c++_learn]$ tree1,編譯靜態庫 libtest.a
gcc -c test.c -o test.o
ar rc libtest.a test.o
//2,編譯main函式
g++ -o main main.cpp -i./test -l./test -static -ltest
test相關檔案放在了當前的test目錄下
.├── main
├── main.cpp
├── test
│ ├── libtest.a
│ ├── makefile
│ ├── test.c
│ ├── test.h
│ ├── test.i
│ ├── test.o
│ └── test.s
├── test.c
└── test.h
[root@ ~/learn_code/c++_learn/test]$ make libtest.a -b
gcc -c test.c -o test.o
ar rc libtest.a test.o
1,可行
2,更可以,推薦用這種方式
對於比較老的c庫,可能當時寫的沒有考慮到宣告extern
3,可行,推薦使用
4,下面這種方式報錯
解釋下原因:根本原因是因為編譯器在編譯c++和c檔案中的函式時,是區別對待的,也就是說同乙個函式名,在c++和c檔案中編譯出來的名字不一樣。
比如說對於mytest函式,對於c編譯後為_mytest,對於c++編譯之後名字為_mytest_。下面解析下上面的幾種情況
對於第1中情況:
c++檔案include了test.h, 展開了其中的__cplusplus巨集,所以對應 extern "c" void mytest(),編譯後為:_mytest
c語法是不支援extern "c"的,當然這裡也不會展開__cplusplus巨集,所以對應 void mytest(),編譯後為:_mytest
對於第2中情況:
更不用說了,同第1中情況
對於第3中情況:
對於以前寫的c庫,可能大多數時候都是這種寫法
這個時候就得在包含它的c++檔案中,必須顯式的宣告 extern "c"關鍵字。
對於第4種情況:
c++檔案include了test.h,對應 void mytest(),編譯後為:_mytest_ (注意與第一種情況的區別)
c語法是不支援extern "c"的,當然這裡也不會展開__cplusplus巨集,所以對應 void mytest(),編譯後為:_mytest
所以這裡在生成main的可執行檔案的時候會鏈結錯誤。
1 [root@ ~/learn_code/c++_learn]$ g++ -o main main.cpp -i./test -l./test -static -ltest1,在寫c函式庫的時候,盡量帶上巨集__cplusplus這一段宣告,方便後面使用2 /tmp/cc3tgbkw.o: in function `main'
:3 main.cpp:(.text+0x5): undefined reference to `mytest()'
4 collect2: ld returned 1 exit status
2,在寫c++程式的時候,加入會呼叫c庫,盡量帶上巨集__cplusplus這一段宣告,肯定就不會報相關編譯的錯誤了。
C 呼叫方法
本小節我們學習兩個簡單的呼叫方法 c 呼叫方法 遞迴方法呼叫,下面我們用 段來實現這兩種呼叫方法。1.本方法解析,讓使用者通過控制台輸入三個浮點型變數,返回給使用者最小值。例項 class comparesize public double findsize 為獲取的資料佔位 public void...
C 呼叫 SAP RFC 方法
新增sap安裝程式的四個dll檔案引用 interop.sapbapicontrollib.dll interop.sapfunctionsocx.dll interop.saplogonctrl.dll interop.saptablefactoryctrl.dll 呼叫方法體 private v...
C 非同步方法呼叫
using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.text u...