在專案實踐中,經常遇到c和c++混合程式設計的情況。
目前的業務需求是:
c寫的幾個檔案,和乙個c++檔案要集成為乙個動態庫,被c++呼叫。而這個動態庫的生成過程中,會鏈結幾個基礎的開發庫,比如libz,libpcre,libm等。
一、c和c++混合編譯動態庫的makefile
編寫這樣的makefile來生成乙個正確的so庫很重要,下面是乙個正確的makefile的寫法:
cc = gcc
c++ = g++
link = g++
libs = -lz -lm -lpcre
#must add -fpic option
ccflags = $(compiler_flags) -c -g -fpic
c++flags = $(compiler_flags) -c -g -fpic
target=libad.so
includes = -i. -i../../
c++files = main.cpp \
../../hookmask.cpp
cfiles = cjson.c zipcoding.c transfercoding.c mem_manage.c
objfile = $(cfiles:.c=.o) $(c++files:.cpp=.o)
all:$(target)
$(target): $(objfile)
$(link) $^ $(libs) -wall -fpic -shared -o $@
%.o:%.c
$(cc) -o $@ $(ccflags) $< $(includes)
%.o:%.cpp
$(c++) -o $@ $(c++flags) $< $(includes)
install:
tsxs -i -o $(target)
clean:
rm -rf $(target)
rm -rf $(objfile)
注意:
1.如果libs的位置放置不對,這幾個基礎庫將不會編進so中。libs只應該在最後鏈結為so時才呼叫,前面編譯c和cpp檔案時用不到。
2.c原始檔放到cfiles巨集後面,cpp檔案放到c++ files巨集後面,第三方庫放到libs巨集後面,標頭檔案的包含路徑放到includes後面,庫檔案的包含路徑放到使用-l./等表示式放到libs中的開頭即可。
3.這裡嚴格區分c和cpp檔案的目的是,c檔案使用gcc編譯,而cpp檔案會使用g++編譯,它們必須嚴格區分開。
下面是依據上面makefile編譯後得到的正確的截圖
二、全部是c檔案編譯的makefile
如果全是c的幾個檔案來編譯乙個動態庫,則相應的makefile檔案編寫如下:
gcc -g cjson.c ad-module.c -lm -lz -lpcre -wall -fpic -shared -o ad_module.so這裡 -lm -lz -lpcre一定要放在-fpic -shared前面,否則生成的動態庫不會包含-lm -lz -lp
C 和C 混合程式設計
由於歷史原因,很多時候我們的 並不完全是使用.net寫成的。這時候和以往c 的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。要在c 中呼叫c 函式,大體的思路是這樣的 首先將c 函式寫成dll形式的庫,然後在c 中匯入dll中的函式進行呼叫。具體的 類似這樣 c 1int ...
C 和C 混合程式設計
由於歷史原因,很多時候我們的 並不完全是使用.net寫成的。這時候和以往c 的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。要在c 中呼叫c 函式,大體的思路是這樣的 首先將c 函式寫成dll形式的庫,然後在c 中匯入dll中的函式進行呼叫。具體的 類似這樣 c 1 int...
C和C 混合程式設計
1 pragma once 關於 pragma once vc 及g 都支援,大膽的用吧。匯出型別必須一致.要麼是c的,要麼是c 2.cplusplus 這個是必須的 ifdef cplusplus extern c endif c 中呼叫c的 1 對於 c 中非類的成員函式,可以簡單的在函式宣告前...