C和C 混合程式設計的Makefile的編寫

2021-10-04 07:11:13 字數 1635 閱讀 5769

在專案實踐中,經常遇到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 中非類的成員函式,可以簡單的在函式宣告前...