Программа, скомпилированная в Linux, не получает код в разделе #ifdef - PullRequest
1 голос
/ 07 февраля 2011

У меня есть кроссплатформенная программа, над которой я работаю, в которой есть несколько файлов с

#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 ]

3 голосов
/ 08 февраля 2011

Ваш make-файл на самом деле работает для файлов c, но не для файлов c ++.

Это потому, что вы вызываете пользовательскую командную строку компиляции для компиляции c, но ваши файлы cpp собираютсянепосредственно в командную строку ссылки, которая не указывает флаги компиляции.

3 голосов
/ 07 февраля 2011

Сначала убедитесь, что вы используете правильную команду, поэтому скопируйте, вставьте вывод из Makefile и выполните его из вашей оболочки (вручную).

Может быть, ваше определение не определено на этом пути, поэтому вотдва подхода, чтобы выяснить, что не так:

1) включить операторы #warning в свой ifdef, чтобы увидеть, действительно ли это пропущенное определение:

#warning "before the define"
#ifdef LINUX
#warning "here goes the linux define" 
..inlcudes
#endif

, если вы компилируете коди не видите предупреждение, тогда вы действительно где-то пропустите определение.

2) Проверьте вывод препроцессора.Для этого отправьте вывод препроцессора (используйте cpp, а не g ++) на стандартный вывод с помощью флага -E.(cpp -E ....)

Просматривая вывод, вы можете увидеть весь включенный код, чтобы вы могли детально отследить, какой код получает ваш компилятор.Я считаю, что этот метод последней инстанции обычно позволяет лучше понять странные проблемы.

0 голосов
/ 07 февраля 2011

Вы должны использовать такую ​​конструкцию:

#ifdef _WIN32
// Windows specific #includes
#else
// Unix specific #includes
#endif

вместо того, чтобы настраивать себя на работу только в Windows и Linux. Не стоит беспокоиться о различиях между Linux и другими системами Unix, пока кто-то не пожалуется, но заранее не усложняйте себе жизнь.

0 голосов
/ 07 февраля 2011

Изменить вас ifdef с

#ifdef WIN32
...inclues
#endif
#ifdef __linux__
..inlcudes
#endif

Если ifdef 'ed - это UNIX, а не Linux, используйте __unix__

...