Makefile C與C 混編的簡單寫法

2021-09-26 22:36:27 字數 2338 閱讀 2335

目錄結構:socket中是基本的socket類,except是捕捉異常類,include 是標頭檔案,basetype.h等,主程式檔案在當前目錄

#target : 目標檔案

#obj_dir_this : 中間檔案存放目錄

#compile.cpp和compile.c : 編譯

#source_paths : 原始碼.c和.cpp存放目錄,多個目錄用空格隔開

#include_paths : 資料夾.h存放目錄,多個目錄用空格隔開

#foreach : 用於遍歷多個目錄

#wildcard : 用於遍歷指定目錄的指定檔案

#relobjfiles_cpp和relobjfiles_c : .cpp和.c編譯後對應的.o檔案

target = server

obj_dir_this = release

c_flags = -wall -g

#如果標頭檔案全部在include中,那麼可以只包含include,如果標頭檔案與原始檔混合,那麼最好將源檔案目錄頁加入cpp_flags 如-i./except \

cpp_flags = -i. \

-i./except \

-i./socket \

-i./include \

-d_gnu_source \

-d_largefile64_source \

-d_file_offset_bits=64 \

-d__stdc_constant_macros

#原始檔存放目錄

source_paths = . ./except ./socket

#標頭檔案包含

include_paths = . ./include

############################ 請不要修改以下內容 #######################################

ld_flags = -lpthread

compile.cpp = g++ $(c_flags) $(cpp_flags) -c

link.cpp = g++

compile.c = gcc $(c_flags) $(cpp_flags) -c

link.c = gcc

relcflags = -o2 -fno-strict-aliasing

sources_cpp = $(foreach dir,$(source_paths),$(wildcard $(dir)/*.cpp))

sources_c = $(foreach dir,$(source_paths),$(wildcard $(dir)/*.c))

headers = $(foreach dir,$(include_paths),$(wildcard $(dir)/*.h))

relobjfiles_cpp = $(sources_cpp:%.cpp=$(obj_dir_this)/%.o)

relobjfiles_c = $(sources_c:%.c=$(obj_dir_this)/%.o)

obj_dir_paths = $(foreach dir,$(source_paths), $(obj_dir_this)/$(dir))

.phony: clean mkdir release

all: mkdir release

mkdir:

mkdir -p $(obj_dir_paths)

release: $(target)

$(target): $(relobjfiles_cpp) $(relobjfiles_c)

$(link.cpp) -o $@ $^ -lrt $(ld_flags)

@echo === make ok, output: $(target) ===

$(relobjfiles_cpp): $(obj_dir_this)/%.o: %.cpp $(headers)

$(compile.cpp) $(relcflags) -o $@ $<

$(relobjfiles_c): $(obj_dir_this)/%.o: %.c $(headers)

$(compile.c) $(relcflags) -o $@ $<

clean:

-$(rm) -rf $(target) $(obj_dir_this) *.d

編譯的效果:

C與C 的混編方法

0 約定 c檔案使用gcc編譯,cpp檔案使用g 編譯,生成對應的object檔案 g 也可以編譯c檔案,但是預設編譯出來的符號是以c 方式 我們可以指定extern c 或者 extern c 來指定編譯的時候函式是以c或者c 方式修飾 使用g 編譯需要嚴格型別檢查,所以對於c檔案,盡量還是用gc...

c 與IDL混編問題

將原有的idl計算模組整合到新的環境中後在計算的時候出錯 attempted to read or write protected memory.this is often anindication that other memory is corrupt.跟蹤 發現getnameddata獲取狀態...

python與C混編的執行邏輯

之前遇到過乙個c語言呼叫python的問題,是載入python版本可以在初始化前設定,如果不設定,會使用預設路徑 usr bin python.設定方法為在py initialize呼叫前使用py setprogramname,即可呼叫指定版本的python 當然還有乙個問題,就是寫了乙個pytho...