директива компилятора для компиляции на разных платформах - PullRequest
0 голосов
/ 11 ноября 2009

Я собираю демонстрационный проект.

Проект написан для windows и linux. Я написал Makefile. Однако я не уверен, как указать платформу, на которой будет компилироваться компилятор.

Я буду компилировать в Linux.

В моем исходном файле у меня есть это:

#if defined(WIN32)
#include ...
#include ...
#elif defined(LINUX)
#include ...
#include ..
#else
#error "OS not supported"
#endif

Вот мой простой Makefile. И когда я компилирую, я получаю ошибку «ОС не поддерживается».

Как добавить директиву, чтобы она компилировалась с определенным #elif (LINUX).

LIBS_PATH = -L/usr/norton/lib
INC_PATH = -I/usr/norton/include

LIBS = -lntr

app: *.cpp *.h Makefile

    g++ $(LIBS_PATH) $(INC_PATH) *.cpp -o app

Большое спасибо за любые предложения,

Ответы [ 2 ]

1 голос
/ 11 ноября 2009

Вы можете добавить -DLINUX = 1 при компиляции.

Также, если вы запустите:

echo "" | cpp -dD

Вы можете увидеть список #define по умолчанию при компиляции. В Linux всегда будет:

#define __linux__ 1

на выходе. Поэтому, если вы измените свой LINUX с помощью вышеуказанного #define, вам не нужно делать ничего особенного. То есть:

...
#elif defined(__linux__)
...

Что касается самого Makefile, я бы сделал что-то вроде:

CXX=g++
CPPFLAGS = -I/usr/norton/include
LDFLAGS = -L/usr/norton/lib -lntr
OBJ_FILES = one.o two.o

app: $(OBJ_FILES) Makefile

one.o: one.cpp one.h

two.o: two.cpp two.h

Так что используются неявные правила.

1 голос
/ 11 ноября 2009

Решите, какая платформа будет использоваться по умолчанию - скажем, LINUX.

LIBS_PATH = -L/usr/norton/lib
INC_PATH  = -I/usr/norton/include
LIBS      = -lntr
PLATFORM  = -DLINUX
CXX       = g++

app: *.cpp *.h Makefile
    ${CXX} ${CFLAGS} ${PLATFORM} ${INC_PATH} *.cpp -o $@ ${LIBS_PATH} ${LIBS}

Вместо скоб можно использовать круглые скобки.Это использует макрос для компилятора C ++, позволяет вам добавлять другие флаги через CFLAGS (хотя это также обычно устанавливается 'make') и добавляет платформу, путь включения, путь к библиотеке и фактическую библиотеку в строку компиляции..

Обратите внимание, что ваше правило обеспечивает полную перекомпиляцию всего, каждый раз, когда что-то меняется.Это «безопасно», но не обязательно эффективно.Обратите внимание, что подстановочные знаки тоже опасны - больше для источника, чем для заголовков.Вы можете включить эту резервную копию файла в сборку (old-reader.cpp - вы действительно хотели, чтобы туда был reader.cpp).Более условно, вы перечисляете объектные файлы, необходимые для программы, чтобы каждый объектный файл можно было индивидуально перестроить при необходимости, а результаты связать вместе.Если вы правильно установили свои зависимости (умеренно большое «если»), то проблем нет.Если вы ошиблись, вы можете получить несовместимые программы.

Однако, если разница между 5-секундной и 5-минутной перекомпиляциями, вам, вероятно, следует выполнить 5-минутную перекомпиляцию (как показано) иответьте на другой вопрос SO во время ожидания.

Чтобы скомпилировать в Linux (64-разрядная версия):

make CFLAGS="-m64"

Чтобы скомпилировать в Linux (32-разрядная версия):

make CFLAGS="-m32"

Для компиляции в Windows 64:

make PLATFORM=-DWIN64

Для компиляции в Windows 32:

make PLATFORM=-DWIN32

И т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...