在 ubuntu 12.04 LTS(64 位)上编译以下 makefile 时遇到此错误:
Ana.cxx:21:46: error: cast from ‘void*’ to ‘int’ loses precision [-fpermissive]
在这一行中:
21 : TThread::Printf("Start of Ana %x \n" ,(int)ptr);
这是生成文件:
ObjSuf = o
SrcSuf = cxx
DllSuf = so
ExeSuf =
OutPutOpt = -o
CXXFLAGS = -g -Wall -fPIC -DOSF1
CXX = g++
CCFLAGS = -g -Wall -DOSF1
CC = gcc
LD = g++
LDFLAGS = -g
SOFLAGS = -shared
ROOTCFLAGS := $(shell root-config --cflags) -DFILL_ON_FLY
ROOTLIBS := $(shell root-config --libs) -lNew -lThread -lMinuit -lPhysics
ROOTGLIBS := $(shell root-config --glibs) -lNew -lThread
EVENTO = BINAEvent.$(ObjSuf) Ana.$(ObjSuf) BINAEventDict.$(ObjSuf) mwpc_software.o tcpip.o Genbood.o
EVENTS = BINAEvent.$(SrcSuf) Ana.$(SrcSuf) BINAEventDict.$(SrcSuf) mwpc_software.c tcpip.c Genbood.c
EVENTLIB = $(ROOTGLIBS)
EVENTEXE = ana
OBJS = $(EVENTO)
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(DllSuf)
.PHONY: Aclock Hello Tetris
$(EVENTEXE): $(OBJS)
$(LD) $^ $(ROOTLIBS) $(OutPutOpt) $@
@echo "$@ done"
clean:
@rm -f $(OBJS) core *~ *Dic* ana *.o
.SUFFIXES: .$(SrcSuf)
BINAEvent.$(ObjSuf): BINAEvent.h
BINAEventDict.$(SrcSuf): BINAEvent.h BINAEventLinkDef.h
@echo "Generating dictionary $@..."
@rootcint -f $@ -c $^
.$(SrcSuf).$(ObjSuf):
$(CXX) $(CXXFLAGS) $(ROOTCFLAGS) -c $<
.c.$(ObjSuf):
$(CXX) $(CXXFLAGS) $(ROOTCFLAGS) -c $<
正确的转换方法是什么?
提前致谢。
最佳答案
该错误与 makefile 无关。该错误位于源代码中,位于错误显示的行上。
在您的平台上,指针不适合 int
。如果将指针强制转换为整数,则可能应该使用 stdint.h
中的 intptr_t
或 uintptr_t
,它们保证足够大。
我不知道TThread::Printf
是什么,它不是标准的。但使用 printf
打印指针地址的常用方法是将指针作为 void*
传递,并使用 %p
格式说明符。 TThread::Printf
也可能出现这种情况。
关于c++ - 错误: cast from ‘void*’ to ‘int’ loses precision [-fpermissive] in makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25489286/