目錄結構: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...