C 呼叫C方法

2022-09-06 18:24:09 字數 2179 閱讀 2415

//

1,編譯靜態庫 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目錄下

[root@ ~/learn_code/c++_learn]$ tree

.├── 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 -ltest

2 /tmp/cc3tgbkw.o: in function `main'

:3 main.cpp:(.text+0x5): undefined reference to `mytest()'

4 collect2: ld returned 1 exit status

1,在寫c函式庫的時候,盡量帶上巨集__cplusplus這一段宣告,方便後面使用

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...