多目录下的makefile文件编写

x33g5p2x  于2021-12-06 转载在 其他  
字(4.1k)|赞(0)|评价(0)|浏览(310)

最近刚刚接触到linux编程,之前没有任何基础,然后花了十天左右的时间将部门的一个windows下的中间件移植到linux平台了,我使用的是多目录下的makefile文件,接下来将具体的实现展示出来一共大家参照交流,linux版本为centOS6.9。

文件根目录下的文件:

include文件夹里面包含的是工程所需的一些头文件,lib库包含的是工程所需的一些库文件,这两个无需makefile文件,直接在其他的makefile中有检索这两个文件夹的操作。

这个是工程中除了include,lib外的目录结构:

根目录下的makefile文件:

  1. #定义编译器
  2. CC = g++
  3. OUT_PUT := cpe_54_08
  4. #将所有的.o文件都编译到OBJ文件夹下
  5. OBJ :=cpe_54_08.o business.o mxdatabase.o socket.o thread.o tool.o work.o
  6. #根目录
  7. TOP_DIR := $(PWD)
  8. OBJ_DIR := $(TOP_DIR)/obj
  9. BIN_DIR := $(TOP_DIR)/CPE_54_08
  10. SRC_BUSINESS_DIR := $(BIN_DIR )/Business
  11. SRC_MXDATABASE_DIR := $(BIN_DIR )/MxDatabase
  12. SRC_SOCKET_DIR := $(BIN_DIR )/Socket
  13. SRC_THREAD_DIR := $(BIN_DIR )/Thread
  14. SRC_TOOL_DIR := $(BIN_DIR )/Tool
  15. SRC_WORK_DIR := $(BIN_DIR )/Work
  16. SUB_DIR := CPE_54_08\
  17. CPE_54_08/Business\
  18. CPE_54_08/MXDatabase\
  19. CPE_54_08/Socket\
  20. CPE_54_08/Thread\
  21. CPE_54_08/Tool\
  22. CPE_54_08/Work
  23. LIB_PATH := $(TOP_DIR)/lib
  24. LINK_LIB := -L$(LIB_PATH) -lbsapi -L$(LIB_PATH) -lMxHandlePool -L$(LIB_PATH) -lServerData -L$(LIB_PATH) -lmxcomlib -L$(LIB_PATH) -lmxdbvar -L$(LIB_PATH) -lchen -luuid
  25. export CC OBJ TOP_DIR OBJ_DIR BIN_DIR SRC_BUSINESS_DIR SRC_MXDATABASE_DIR\
  26. SRC_SOCKET_DIR SRC_THREAD_DIR SRC_TOOL_DIR SRC_WORK_DIR
  27. all:$(SUB_DIR) $(OUT_PUT)
  28. $(SUB_DIR):ECHO
  29. make -C $@
  30. ECHO:
  31. @echo $(SUB_DIR)
  32. @echo begin compile
  33. $(OUT_PUT):$(OBJ_DIR)/cpe_54_08.o $(OBJ_DIR)/dbsend.o $(OBJ_DIR)/localcontrollerstate.o $(OBJ_DIR)/mxdatabase.o $(OBJ_DIR)/optimalpathinformation.o $(OBJ_DIR)/stdafx.o $(OBJ_DIR)/tool.o\
  34. $(OBJ_DIR)/localfault.o $(OBJ_DIR)/localcontrollerlist.o $(OBJ_DIR)/dbread.o $(OBJ_DIR)/container.o $(OBJ_DIR)/networkinformation.o $(OBJ_DIR)/managenetwork.o $(OBJ_DIR)/ycodec.o\
  35. $(OBJ_DIR)/thread.o $(OBJ_DIR)/socket.o
  36. g++ -o $(OUT_PUT) $(OBJ_DIR)/cpe_54_08.o $(OBJ_DIR)/dbsend.o $(OBJ_DIR)/localcontrollerstate.o $(OBJ_DIR)/mxdatabase.o $(OBJ_DIR)/optimalpathinformation.o $(OBJ_DIR)/stdafx.o $(OBJ_DIR)/tool.o\
  37. $(OBJ_DIR)/localfault.o $(OBJ_DIR)/localcontrollerlist.o $(OBJ_DIR)/dbread.o $(OBJ_DIR)/container.o $(OBJ_DIR)/networkinformation.o $(OBJ_DIR)/managenetwork.o $(OBJ_DIR)/ycodec.o $(OBJ_DIR)/thread.o\
  38. $(OBJ_DIR)/socket.o $(LINK_LIB) -lpthread
  39. clean:
  40. rm -rf $(OBJ_DIR)/*.o $(OUT_PUT)

OBJ文件中的makefile:
将工程中的所有cpp文件编译出来的 .o 文件都放在这个文件夹下。

  1. $(BIN_DIR)/$(BIN):$(OBJ)
  2. $(CC) $^ -o $@

CPE_54_08文件目录下的makefile:

  1. INCLUDE_DIR := ../include ../
  2. DIR := -I$(INCLUDE_DIR)
  3. all:$(OBJ_DIR)/cpe_54_08.o $(OBJ_DIR)/stdafx.o
  4. $(OBJ_DIR)/cpe_54_08.o:CPE_54_08.cpp
  5. $(CC) -c $< $(DIR) -o $@ -std=c++0x
  6. $(OBJ_DIR)/stdafx.o:stdafx.cpp
  7. $(CC) -c $< $(DIR) -o $@

Business文件下的makefile:

  1. INCLUDE_DIR := ../../inlcude ../Business
  2. DIR = -I$(INCLUDE_DIR)
  3. all:$(OBJ_DIR)/localcontrollerlist.o $(OBJ_DIR)/localcontrollerstate.o $(OBJ_DIR)/localfault.o $(OBJ_DIR)/managenetwork.o $(OBJ_DIR)/networkinformation.o $(OBJ_DIR)/optimalpathinformation.o
  4. $(OBJ_DIR)/localcontrollerlist.o:LocalControllerList.cpp
  5. $(CC) -c $< $(DIR) -o $@ -std=c++0x
  6. $(OBJ_DIR)/localcontrollerstate.o:LocalControllerState.cpp
  7. $(CC) -c $< $(DIR) -o $@ -std=c++0x
  8. $(OBJ_DIR)/localfault.o:LocalFault.cpp
  9. $(CC) -c $< $(DIR) -o $@ -std=c++0x
  10. $(OBJ_DIR)/managenetwork.o:ManageNetwork.cpp
  11. $(CC) -c $< $(DIR) -o $@ -std=c++0x
  12. $(OBJ_DIR)/networkinformation.o:NetworkInformation.cpp
  13. $(CC) -c $< $(DIR) -o $@ -std=c++0x
  14. $(OBJ_DIR)/optimalpathinformation.o:OptimalPathInformation.cpp
  15. $(CC) -c $< $(DIR) -o $@ -std=c++0x

MXDatabase文件下的makefile:

  1. INCLUDE_DIR := ../MXDatabase ../../include
  2. DIR := -I$(INCLUDE_DIR)
  3. all:$(OBJ_DIR)/mxdatabase.o
  4. $(OBJ_DIR)/mxdatabase.o:NetElementDb.cpp
  5. $(CC) -c $< $(DIR) -o $@ -std=c++0x

Socket文件下的makefile:

  1. INCLUDE_DIR := ../../include ../
  2. DIR := -I$(INCLUDE_DIR)
  3. all:$(OBJ_DIR)/socket.o
  4. $(OBJ_DIR)/socket.o:UDP.cpp
  5. $(CC) -c $< $(DIR) -o $@

Thread文件下的makefile:

  1. INCLUDE_DIR := ../../include ../
  2. DIR := -I$(INCLUDE_DIR)
  3. all:$(OBJ_DIR)/thread.o
  4. $(OBJ_DIR)/thread.o:Thread.cpp
  5. $(CC) -c $< $(DIR) -o $@

Tool文件下的makefile:

  1. INCLUDE_DIR := ../../include ../
  2. DIR := -I$(INCLUDE_DIR)
  3. all:$(OBJ_DIR)/tool.o $(OBJ_DIR)/ycodec.o
  4. $(OBJ_DIR)/tool.o:Tools.cpp
  5. $(CC) -c $< $(DIR) -o $@
  6. $(OBJ_DIR)/ycodec.o:YCodec.cpp
  7. $(CC) -c $< $(DIR) -o $@

Work文件下的makefile:

  1. INCLUDE_DIR := ../../include ../
  2. DIR := -I$(INCLUDE_DIR)
  3. all:$(OBJ_DIR)/container.o $(OBJ_DIR)/dbsend.o $(OBJ_DIR)/dbread.o
  4. $(OBJ_DIR)/container.o:Container.cpp
  5. $(CC) -c $< $(DIR) -o $@
  6. $(OBJ_DIR)/dbread.o:DbRead.cpp
  7. $(CC) -c $< $(DIR) -o $@ -std=c++0x
  8. $(OBJ_DIR)/dbsend.o:DbSend.cpp
  9. $(CC) -c $< $(DIR) -o $@ -std=c++0x

最后成功生成可执行文件:

相关文章