我有一个我正在研究的跨平台程序,它有几个带
的文件#ifdef WIN32
...inclues
#endif
#ifdef LINUX
..inlcudes
#endif
当我在LINUX上编译时,我一直在收到关于找不到函数等的错误,但是如果我注释掉#ifdef LINUX块(仍然保持包含未注释的)它可以工作,所以它接缝好像我的定义不是工作正常。
这是我的make文件(文件名已更改):
CC = gcc
CPP = g++
CFLAGS = -DLINUX $(INCLUDES) -c -g -O0 -Wall -fpic
INCLUDES = -I.
LFLAGS += -fpic -shared
LFLAGS += -lpthread
CFILES = a.c b.c c.c d.c e.c f.cpp g.cpp h.cpp i.cpp
##all: $(SFILES:.s=.s.o) $(CFILES:.c=.o) $(CFILES:.cpp=.o)
## $(CPP) $(INCLUDES) $(LFLAGS) -o libclient.so.1.0 $(CFILES:.c=.o) $(CFILES:.cpp=.o)
all: $(SFILES:.s=.s.o) $(CFILES:.c=.o)
$(CPP) $(INCLUDES) $(LFLAGS) -o libclient.so.1.0 $(CFILES:.c=.o)
%.o : %.c
$(CPP) -c $(CFLAGS) $< -o $@
%.o : %.cpp
$(CPP) -c $(CFLAGS) $< -o $@
clean:
rm *.o libclient.so.1.0
答案 0 :(得分:3)
首先确保使用正确的命令,因此请复制粘贴Makefile的输出并从shell执行(手动)。
也许你的定义是未定义的,所以,这里有两种方法可以找出错误:
1)在ifdef中包含#warning语句,看看它是否真的缺少定义:
#warning "before the define"
#ifdef LINUX
#warning "here goes the linux define"
..inlcudes
#endif
如果您编译代码并且没有看到警告,那么确实您错过了某处的定义。
2)检查预处理器输出。为此,请使用-E标志将预处理器(使用cpp而不是g ++)输出发送到stdout。 (cpp -E ....)
通过查看输出,您可以看到包含的所有代码,因此您可以详细跟踪编译器获得的代码。我发现这种最后的方法通常可以提供最多的洞察力 奇怪的问题。
答案 1 :(得分:3)
您的make文件确实适用于c文件,但不适用于c ++文件。
这是因为您为c编译调用了自定义编译命令行,但是您的cpp文件直接进入了没有指定编译标志的链接命令行。
答案 2 :(得分:0)
将ifdef
更改为
#ifdef WIN32
...inclues
#endif
#ifdef __linux__
..inlcudes
#endif
如果ifdef
'ed内容是UNIX而不是Linux特定的,请使用__unix__
答案 3 :(得分:0)
你应该使用这样的结构:
#ifdef _WIN32
// Windows specific #includes
#else
// Unix specific #includes
#endif
而不是让自己在Windows和Linux上仅工作。 Linux和其他Unix系统之间的差异并不值得担心,直到有人抱怨,但不要提前让自己更难生活。