2016-09-28 2 views
1

C++ новичок здесь моя команда g++ main.cpp -o main дает мне ссылки ошибки, подобные следующимМножественные связывание C++ файлов

ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

если я прохожу C++ файлы g++ main.cpp myfile.cpp -o main все правильно

какие-либо идеи, как скомпилировать несколько C++ файлы без передачи всего в командной строке.

Благодаря

+0

ли г ++ называть лязг компоновщик? –

+0

Да, это работает, но я думаю, что лучший способ - создать файл make – sger

+0

Поскольку вы уже знаете, что Makefile - это способ пойти, в чем проблема? –

ответ

1

какие-либо идеи, как скомпилировать несколько C++ файлов без прохождения все в командной строке.

Для создания приложения необходимы все объектные файлы, поэтому вам необходимо передать все файлы cpp в компилятор.

Но для простых случаев, когда все CPP-файлы остаются в одной папке, вы можете использовать команду (простой, но медленный метод):

g++ *.cpp -o main 
1

какие-либо идеи, как скомпилировать несколько C++ файлов без прохождения все в командной строке.

Сначала создают объектные файлы:

g++ -c main.cpp -o main.o 
g++ -c myfile.cpp -o myfile.o 

Затем передают их линкер:

g++ main.o myfile.o -o main 
+0

Иногда порядок, в котором библиотеки должны быть указаны в командной строке компоновщика. Вы также можете прочитать этот пост об этом: [https://stackoverflow.com/questions/45135/...](https://stackoverflow.com/questions/45135/why-does-the-order-in-which -libraries-являются-сшитым-порой причинно-ошибка-в-GCC) – hoelzlw

1

Хотя есть довольно большие кривые обучения для Make, заставит файл является предпочтительным решением , В SO я также заметил значительное использование CMake.


Дополнительные идеи для вашего Makefile:

Следующие два правила управляют 90% моих простых модульных тестов исполняемым:

  • R01 обрабатывает файлы как с .cc и .hh

  • R02 обрабатывает файлы только с .cc


# pattern rule R01 
# when any ARCHIVE changes, trigger a rebuild 
% : %.cc %.hh $(LIB_ARCHIVEs) 
    @echo 
    @echo R01: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) $< -o [email protected] $(LIB_DIRs) $(LIB_NMs) 

# pattern rule R02 
# when any ARCHIVE changes, trigger a rebuild 
% : %.cc $(LIB_ARCHIVEs) 
    @echo 
    @echo R02: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) $< -o [email protected] $(LIB_DIRs) $(LIB_NMs) 

Иногда я буду добавлять конкретные LIB имена и каталоги ... непосредственно к LIB_DIRs и определение LIB_NMs в Makefile. Например, здесь я добавил -lrt и -pthread:

LIB_NMs += -lbag_i686 -lposix_i686 -lrt -pthread 

bag_i686 и posix_i686 являются библиотеки я построил ... простые обертки класса C++ вокруг Линукс и Posix функций. Большинство моих модульных тестов не используют большую часть статей, но я не испытываю печали, включая его.

С C++ std :: thread, я редко использую -pthread. Тем не менее, я иногда пользуюсь posix семафором.


Мой доступ к командной строке компиляции (в Emacs на Ubuntu) обеспечивает историю, поэтому случайные изменения или дополнения в командной строке только «заморачиваться» один раз. С этого момента новая команда доступна в истории.

В Emacs запускаю настроен с «встроенной» команды заранее определенной компиляции:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' -j 2 -k 

Эта команда показывает до 1-й раз, когда я запустить компилятор изнутри Emacs. Emacs представляет его так, как будто команда уже находится в «истории компиляции команд».

я вручную сократить это, если я не восстанавливать все, как правило, я только построить единую ут:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' 

Так, например, когда я готов к компиляции dumy431.cc, я призываю:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' dumy431 

Следующая сборка, которую я запускаю (из компиляции emacs), начинается с предыдущей команды, а стрелка вверх/вниз перемещается по любой другой версии команды.


С помощью этой формы команды, я могу тривиальным изменить с г ++ звенеть ++, вставив «клан» в соответствующем месте:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='clang++ -m64' 

лязг ++ часто обеспечивает дополнительную диагностику, что г ++ не сообщают. Чтобы вернуться к g ++, я могу увеличить стрелку на панели команд компилятора (или отредактировать команду).


Вот небольшой пример, когда мой модульный тестовый код содержит несколько файлов src. Часто, не-основные файлы (такие как. Eng_format *) являются код, который я планирую захватить один из моих библиотек для будущего использования:

FMssb.o : FMssb.cc FMssb.hh 
    @echo 
    @echo R_FMssb.o: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) -c $< -o [email protected] 

FMssb_ut : FMssb_ut.cc eng_format.o FMssb.o $(LIB_ARCHIVEs) 
    @echo 
    @echo R_FMssb_ut: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) $< -o [email protected] eng_format.o FMssb.o $(LIB_DIRs) $(LIB_NMs) 

eng_format.o : eng_format.cpp eng_format.hpp $(LIB_ARCHIVEs) 
    @echo 
    @echo R_EF: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) -c $< -o [email protected] $(LIB_DIRs) $(LIB_NMs)