2010年10月13日星期三

nm gcc参数顺序

用nm可以查看目标文件以及库文件中包含的方法。如果链接中出现undefined reference,可以用nm去查看一下相关的库中是否存在那个方法进行错误排除。

$(OBJDIR)/stdsoap2.o: $(COMA_libs)/$(LIB_GSOAP)/stdsoap2.c $(COMA_libs)/$(LIB_GSOAP)/plugin/httpform.c $(COMA_libs)/$(LIB_GSOAP)/plugin/httpget.c
$(CC) -Os -I$(COMA_libs)/$(LIB_GSOAP) -L $(COMA_libs)/$(LIB_GSOAP) $(THREAD) -c -o $@ -DWITH_OPENSSL $^
上面是有问题的,需要调整参数顺序。注意-c -o的顺序。
$(OBJDIR)/stdsoap2.o: $(COMA_libs)/$(LIB_GSOAP)/stdsoap2.c $(COMA_libs)/$(LIB_GSOAP)/plugin/httpform.c $(COMA_libs)/$(LIB_GSOAP)/plugin/httpget.c
 $(CC) -Os -I$(COMA_libs)/$(LIB_GSOAP) -L $(COMA_libs)/$(LIB_GSOAP) $(THREAD) -DWITH_OPENSSL -c -o $@ $< 

下面是原来指令中缺少了两个目标文件,不能链接。
COMA:   $(OBJECT_FILES) $(API_FILES) $(ADAPTER_FILES) $(GUI_FILES) $(ENV_OBJECT_FILES)    $(OBJDIR)/stdsoap2.o  $(OBJDIR)/NE3S_serverlib.o $(OBJDIR)/NE3S_clientlib.o $(OBJDIR)/env.o $(OBJDIR)/app.o bin/tree.o
 $(CC) -g -Xlinker -Map -Xlinker COMA.map -Os -L $(COMA_libs)/$(LIB_GSOAP) -L $(COMA_libs)/zlibonly-dll/lib -L $(COMA_libs)/libarchive-2.5.5/.libs $(COMA_libs)/$(LIB_GSOAP)/libgsoap.a $(THREAD) -pedantic  -o COMA $(GUI_FILES) $(ENV_OBJECT_FILES) $(API_FILES) $(ADAPTER_FILES) $(OBJECT_FILES)  $(OBJDIR)/stdsoap2.o $(OBJDIR)/NE3S_serverlib.o $(OBJDIR)/NE3S_clientlib.o $(OBJDIR)/env.o $(OBJDIR)/app.o bin/tree.o ../$(OBJDIR)/httpget.o ../$(OBJDIR)/httpform.o $(COMA_libs)/libarchive-2.5.5/.libs/libarchive.a  -DWITH_OPENSSL -lcrypto -lexpat -lssl -lz