程序员的自我修养:链接、装载与库(一本书,估计没时间看。。。哭。。。)

g++ -std=c++11 -I./include -I./include/asio/include main.cpp -o aaaa -L./lib -lhttp_server -lpthread

最近在写http协议栈,给其他部门的服务作为各个服务的monitor使用。涉及到自己的代码与其他人的代码整合,编译的问题,特记录一些过程。

待解决的问题:

1.-lpthread在cmakelists里面不好使,target_link_libraries(monitor-agent
${CMAKE_DL_LIBS}
${CMAKE_THREAD_LIBS_INIT}
) 要用${CMAKE_THREAD_LIBS_INIT}才行,为啥??

2.cmakelist编译动态库和静态库的关键字。

3.编译静态库不是使用g++...使用的事ar,是一个将若干.o打包的过程。。。

MakeFile的学习和书写

https://www.cnblogs.com/lidabo/p/4521117.html

https://blog.csdn.net/mgsweet/article/details/80084873

# ifndef DDK_HOME
# $(error "Can not find DDK_HOME env, please set it in environment!.")
# endif

# ifeq ($(mode),)
# mode=AtlasDK
# endif

# ifeq ($(mode), AtlasDK)
# CC := aarch64-linux-gnu-g++

# LNK_FLAGS := 
#     -L$(HOME)/ascend_ddk/device/lib -L$(DDK_HOME)/device/lib/ 
#     -shared
# else ifeq ($(mode), ASIC)
# CC := $(DDK_HOME)/toolchains/aarch64-linux-gcc6.3/bin/aarch64-linux-gnu-g++
# LNK_FLAGS := 
#     -L$(HOME)/ascend_ddk/device/lib -L$(DDK_HOME)/device/lib/ 
#     -shared
# else
# $(error "Unsupported mode: "$(mode)", please input: AtlasDK or ASIC.")
# endif


CC := g++
FLAGS := -I./include/asio/include -I./include -g -std=c++11 -fPIC -DCPU_ONLY -DASIO_STANDALONE
# FLAGS := -Iinclude/asio/include -g -std=c++11 -fPIC -DCPU_ONLY -DASIO_STANDALONE
#INC_DIR := include
SRC_DIR := ./src/http
#HTTP_DIR := http
BUILD_DIR := ./src/build
BIN_DIR := ./lib
#INCLUDE := -I./$(INC_DIR)
DIRS := $(shell find $(SRC_DIR) -maxdepth 3 -type d)

SOURCES  = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))  
OBJECTS  = $(addprefix $(BUILD_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SOURCES)))) 

$(BIN_DIR)/libhttp_server.so: $(OBJECTS)
    @mkdir -p $(BIN_DIR)
    $(CC) $(FLAGS) $(INCLUDE) -shared -fPIC $^ -o $@

# $(BUILD_DIR)/main.o: ../main.cpp
#     @mkdir -p $(BUILD_DIR)
#     #$(CC) $(FLAGS) $(INCLUDE) -c -o $@ $(SRC_DIR)/main.cpp
#     $(CC) $(FLAGS) -c -o $@ ../main.cpp

$(BUILD_DIR)/server.o: $(SRC_DIR)/server.cpp
    @mkdir -p $(BUILD_DIR)
    $(CC) $(FLAGS) -c -o $@ $<
    
$(BUILD_DIR)/connection.o: $(SRC_DIR)/connection/connection.cpp
    @mkdir -p $(BUILD_DIR)
    $(CC) $(FLAGS) -c -o $@ $<

$(BUILD_DIR)/connection_manager.o: $(SRC_DIR)/connection/connection_manager.cpp
    @mkdir -p $(BUILD_DIR)
    $(CC) $(FLAGS) -c -o $@ $<

$(BUILD_DIR)/request_handler.o: $(SRC_DIR)/handles/request_handler.cpp
    @mkdir -p $(BUILD_DIR)
    $(CC) $(FLAGS) -c -o $@ $<

$(BUILD_DIR)/request_parser.o: $(SRC_DIR)/handles/request_parser.cpp
    @mkdir -p $(BUILD_DIR)
    $(CC) $(FLAGS) -c -o $@ $<

$(BUILD_DIR)/mime_types.o: $(SRC_DIR)/message/mime_types.cpp
    @mkdir -p $(BUILD_DIR)
    $(CC) $(FLAGS) -c -o $@ $<

$(BUILD_DIR)/request.o: $(SRC_DIR)/message/request.cpp
    @mkdir -p $(BUILD_DIR)
    $(CC) $(FLAGS) -c -o $@ $<

$(BUILD_DIR)/response.o: $(SRC_DIR)/message/response.cpp
    @mkdir -p $(BUILD_DIR)
    $(CC) $(FLAGS) -c -o $@ $<

clean:  
    @rm -rf $(BUILD_DIR)
    @rm -f $(BIN_DIR)/libhttp_server.so

(编译)使用动态库:参考b站linux全栈视频讲解

g++ -std=c++11 -I./include -I./include/asio/include main.cpp -o aaaa -L./lib -lhttp_server -lpthread

原文地址:https://www.cnblogs.com/kongweisi/p/14371602.html