#ifdef и условная компиляция с Makefile - PullRequest
0 голосов
/ 14 мая 2018

Прежде чем спросить, я видел это, пытался, но не помогло: условный комплимент на основе переменной в make-файл

В моем случае мой src_file.c содержит:

#ifndef WITH_ATS
#define WITH_ATS
#include "ats.h"
#endif

И Makefile имеет:

ifdef WITH_ATS
INCLUDEDIR += -I../at2_build/include/
LDFLAGS += -L$(AT2) -lat2 -Wl,-rpath=$(AT2)
CFLAGS += -DWITH_ATS
endif

Что я пытаюсь сделать, если я сделаю make WITH_ATS=1 файл должен скомпилироваться с скомпилированной ats lib, тогда как если компиляция make WITH_ATS=0 должна выполняться без ats lib.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Makefile

Переменная WITH_ATS равна не пуста при запуске make WITH_ATS=0, и поэтому ifdef WITH_ATS в файле Makefile оценивается как true (т. Е. Не то, что вы ожидаете).

Что вам действительно нужно, так это проверить, равен ли WITH_ATS 1.Это может быть достигнуто с помощью ifeq:

ifeq ($(WITH_ATS),1)
INCLUDEDIR += -I../at2_build/include/
LDFLAGS += -L$(AT2) -lat2 -Wl,-rpath=$(AT2)
CFLAGS += -DWITH_ATS
endif

C исходный файл

В вашем src_file.c вам не нужны ни #ifndef, ни #define.Таким образом, вы реализуете include guard , который не тот, который вы хотите, что вам действительно нужно:

#ifdef WITH_ATS
#include "ats.h"
#endif

То есть включитьats.h, если определено WITH_ATS.

Обратите внимание, что в исходном файле C WITH_ATS - это просто пустой макрос (т. Е. С ним не связано никакое значение), тогда как в вашем make-файле, WITH_ATS - это переменная, которая принимает значение, переданное в командной строке, например, 0 для make WITH_ATS=0.

0 голосов
/ 14 мая 2018

Используйте if вместо ifdef.

#if WITH_ATS
#include "ats.h"
#endif
...