1. 工程檔案架構
drwxrwxr-x 3 joshyoby joshyoby 4096 2月 25 15:03 ./
drwxrwxr-x 8 joshyoby joshyoby 4096 2月 25 14:45 ../
-rw-rw-r-- 1 joshyoby joshyoby 671 2月 25 14:58 makefile
-rw-rw-r-- 1 joshyoby joshyoby 168 2月 25 14:57 my_main.cpp
drwxrwxr-x 2 joshyoby joshyoby 4096 2月 25 14:49 temp/
-rw-rw-r-- 1 joshyoby joshyoby 67 2月 25 14:54 test.c
-rw-rw-r-- 1 joshyoby joshyoby 66 2月 25 14:54 test.h
-rw-rw-r-- 1 joshyoby joshyoby 158 2月 25 14:48 tools.cpp
-rw-rw-r-- 1 joshyoby joshyoby 188 2月 25 14:42 tools.h
temp目錄下只有乙個 my_main.c 檔案
2. test.c 內容
#include "test.h"
int testadd(int a, int b)
3. test.h 內容
#ifndef test_h
#define test_h
int testadd(int a, int b);
#endif
4. tools.cpp 內容
#include "tools.h"
#ifdef __cplusplus
extern "c"
#endif
#endif
6. my_main.cpp檔案內容
這裡展示了如何在.cpp檔案中呼叫.c檔案中的函式。
#include #include "tools.h"
extern "c"
using namespace std;
int main()
8. makefile檔案內容
#指定編譯工具
cc = gcc
cpp = g++
link = g++
libs = -lpthread
#編譯.so 必須新增 -fpic 和 -shared 選項
ccflags = -c -g -fpic
cppflags = -c -g -fpic
#期望得到的執行檔案或動態庫.so
#target=libxx.so
target=test
includes = -i. #-i../../
cppfiles = $(wildcard *.cpp ../*.cpp)#遍歷得到當前目錄及上層目錄中的所有.cpp檔案
cfiles = $(wildcard *.c ../*.c)#遍歷得到當前目錄及上層目錄中的所有.c檔案
objfile = $(cfiles:.c=.o) $(cppfiles:.cpp=.o)
all:$(target)
$(target): $(objfile)
# 編譯得到 .so 檔案用下面的**
# $(link) $^ $(libs) -wall -fpic -shared -o $@
# 編譯得到可執行檔案用下面的**
$(link) $^ $(libs) -wall -o2 -o $@
%.o:%.c
$(cc) -o $@ $(ccflags) $< $(includes)
%.o:%.cpp
$(cpp) -o $@ $(cppflags) $< $(includes)
clean:
rm -rf $(target)
rm -rf $(objfile)
符號解釋:
$@----表示目標檔案
$^----表示所的依賴檔案
$<----表示所依賴的當前這乙個檔案
在當前工程目錄下,開啟終端視窗,輸入make命令即可得到test可執行檔案。
c與c 混合程式設計
在純c的系統中使用c 的類出現了編譯錯誤!程式 begin mymain.c include thesocket.h void main int argc,char argv end mymain.c begin thesocket.h class thesocket end thesocket.h...
c與c 混合程式設計
1.引言 c 語言的建立初衷是 a better c 但是這並不意味著c 中類似 c語言的全域性 變數和函式所採用的編譯和連線方式與c語言完全相同。作為一種欲與c相容的語言,c 保留了一部分過程式語言的特點 被世人稱為 不徹底地物件導向 因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是...
C與C 混合程式設計
c 是在 c 語言的基礎上發展起來的。在某種程度上,我們可將 c 看做 c 的一種擴充套件。在本質上,二者的資料型別和函式呼叫慣例都是一致的,因此 c 與 c 混合編譯也是很自然的事情。二者的區別僅在於編譯後函式的名字不同 c 簡單地使用函式名而不考慮引數的個數或型別,而 c 編譯後的函式名則總是將...