как сделать файл с помощью iostream, string и библиотеки ifstream - PullRequest
1 голос
/ 16 августа 2011

Я пытаюсь создать make-файл для приложения, которое использует строку lib iostream и fstream.that, что я делал до сих пор

       CPP      = gcc
       LIB_DIR      = ./incl
       PROGRAMS = test
       PROGS_O      = action_rec.o
       CPPFLAGS = -I$(LIB_DIR) -pg -g
       VPATH        = ./src/
       OBJFILES = $(VPATH)$(patsubst %.cpp,%.o,$(wildcard *.cpp))
       LIBS     = -02 -liostream -lfstream -lstdlib -lstring

когда я пытаюсь использовать свой make-файл, я получаю в результате, что все, что требует строку lib fstream и iostream, не было объявлено, тогда как все, что требует lib stdlib, работает правильно. Может кто-нибудь сказать мне, почему? спасибо

Ответы [ 4 ]

4 голосов
/ 16 августа 2011

Здесь есть два отдельных вопроса.

Сторона C ++: Не используйте двоичный файл gcc для компиляции кода C ++ - используйте вместо него g++. Это автоматически включит все необходимые стандартные пути включения и библиотеки.

Сторона Makefile: Ваш Makefile имеет ряд проблем:

  1. Не устанавливать CPP для компилятора; эта переменная определяет используемый препроцессор. Используйте CXX для определения компилятора - скорее всего, в любом случае он определен как g++.

  2. Не создавать программы с именем test. Это происходит из-за столкновения со стандартной программой Unix (/usr/bin/test), и если вы не обращаете на это внимания, вы можете в итоге вызвать неправильную программу.

  3. Не передавайте -02, поскольку компоновщик помечается через LIBS. Этот переключатель а) неверно сформулирован (это должно быть -O2, буква O не ноль) и б) это флаг компилятора, поэтому он должен быть частью CXXFLAGS.

  4. Скорее всего, вам вообще не нужен Makefile. Программа make поставляется с файлами Makefile по умолчанию, поэтому вы часто можете просто создать файл main.cpp и запустить

    make main
    

    Это автоматически компилирует и связывает main.cpp в main исполняемый файл. В вашем случае что-то вроде

    CXXFLAGS="-I./incl -pg -g -O2" make main
    

    Может быть достаточно.

4 голосов
/ 16 августа 2011

Попробуйте вынуть весь поток -lstring -stdlib -liostream -lfstream и посмотреть, исправит ли он это.

И скомпилируйте с g ++, чтобы он нашел другие вещи, необходимые для связи кода C ++.

1 голос
/ 16 августа 2011

Очевидная проблема в том, что вы связываетесь с gcc, а не g++.gcc не ссылается на стандартную библиотеку C ++.Вы можете добавить его вручную, но самое простое - просто использовать g++ для всего (если у вас нет действительного кода C; g++ будет компилировать файлы, заканчивающиеся на .c как C ++).

0 голосов
/ 16 августа 2011

LIBS = -02 -liostream -lfstream -lstdlib -lstring можно упростить.Просто используйте LIBS = -O2 (я думаю, что вы имели в виду -O2, а не -02.) На самом деле вам вообще не следует передавать флаг -O на стадию соединения.Оптимизация - это опция времени компиляции, а не опция связи.

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