在Linux上编译的程序没有在#ifdef部分获得代码

时间:2011-02-07 19:02:00

标签: c++ linux g++ undefined c-preprocessor

我有一个我正在研究的跨平台程序,它有几个带

的文件
#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

4 个答案:

答案 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系统之间的差异并不值得担心,直到有人抱怨,但不要提前让自己更难生活。