今天想在公司环境下练习一下 mongoose 搭建 http 服务的代码,下载了 源码 但是编译出现了问题,记录一下。
1,头文件问题
找不到 json.h 头文件
下载下来已经有 json 源码,所以指定一下就可以了,修改 main.cpp,如:
2,找不到 json 接口问题
Makefile 里添加库路径及库名称:-L../json -ljson
3,没有编译 mongoose.c 问题
如上图中的 mg_ 开头的函数是在 mongoose.c 里,这个得修改Makefile 了,原先的没有对 mongoose.c 进行编译,添加编译.c的命令:
4,没有找到 ssl 接口问题
Makefile 添加 -lssl
5,库版本不匹配问题
libssl.a 和 libssl.so 静态库和动态库是有的,但都是 32 位的
所以只能编译 32 位的程序了,修改Makefile ,添加编译选项 -m32 可以编译 32 位程序。
- CC = gcc -m32
- CPP = $(CROSS)g++ -std=c++11 -m32
6,json 库找不到的问题
json库明明是有的,结果一看是 64 位的
编译 32 位 json 库也很简单,修改其目录下的 Makefile,添加编译选项 -m32 即可编译出 32 位的库了。
再在 Makefile 里修改链接的库名: -ljson32。最终的 Makefile 为:
- #中间文件存放目录,如.o 和 .d 文件
- COMPILE_DIR = compile
- BIN_DIR = bin
-
- # 可编译arm版本
- #CROSS = arm-himix200-linux-
- CC = gcc -m32
- CPP = $(CROSS)g++ -std=c++11 -m32
- CFLAGS = -Werror -g
-
- LIB =-L../json -ljson32 -lpthread -lssl -lcrypto
- # SRCS = $(wildcard *.cpp)
- CPP_SRCS = $(shell ls -t | grep "\.cpp$$" | head -1)
- CPP_OBJS = $(patsubst %.cpp, $(COMPILE_DIR)/%.o, $(CPP_SRCS))
- CPP_DEP = $(patsubst %.cpp, $(COMPILE_DIR)/%.cpp.d, $(CPP_SRCS))
-
- C_SRCS = mongoose.c
- C_OBJS = $(patsubst %.c, $(COMPILE_DIR)/%.o, $(C_SRCS))
- C_DEP = $(patsubst %.c, $(COMPILE_DIR)/%.c.d, $(C_SRCS))
-
- OBJS = $(CPP_OBJS) $(C_OBJS)
- DEP_ALL = $(CPP_DEP) $(C_DEP)
-
- $(shell if [ ! -d $(COMPILE_DIR) ]; then mkdir $(COMPILE_DIR); fi)
- $(shell if [ ! -d $(BIN_DIR) ]; then mkdir $(BIN_DIR); fi)
-
-
- TARGET=$(BIN_DIR)/$(BIN)
-
- all: $(TARGET)
-
- -include $(DEP_ALL)
-
- $(TARGET): $(OBJS)
- $(CPP) $(CFLAGS) $^ -o $@ $(LIB)
-
-
- $(COMPILE_DIR)/%.o: %.cpp $(COMPILE_DIR)/%.cpp.d
- $(CPP) $(CFLAGS) -c $< -o $@
-
- $(COMPILE_DIR)/%.cpp.d: %.cpp
- $(CPP) $(CFLAGS) -MM -E -c $< -o $@
- @sed 's/.*\.o/$(subst /,\/,$(dir $@))&/g' $@ > $@.tmp
- @mv $@.tmp $@
-
- $(COMPILE_DIR)/%.o: %.c $(COMPILE_DIR)/%.c.d
- $(CC) $(CFLAGS) -c $< -o $@
-
- $(COMPILE_DIR)/%.c.d: %.c
- $(CC) $(CFLAGS) -MM -E -c $< -o $@
- @sed 's/.*\.o/$(subst /,\/,$(dir $@))&/g' $@ > $@.tmp
- @mv $@.tmp $@
-
- .PHONY: clean
- clean:
- rm -rf $(COMPILE_DIR) $(BIN_DIR)
Makefile 主要是将 c 和 cpp 文件分开编译了。