2016-02-03 2 views
1

Я хотел бы скомпилировать свою программу, но у меня есть некоторые проблемы для этого. Моя программа состоит из основной функции, написанной на C. Другие файлы - это файлы .h или .cpp, которые я не написал. У меня есть файл make, но, к сожалению, я не могу скомпилировать свою программу. Это «архитектура» файлов:Makefile для компиляции файлов c и cpp

a.h содержит только определения констант.

b.h и b.cpp. b.cpp включает a.h

c.h и d.cpp. c.h содержит сигнатуры методов d.cpp. d.cpp включает a.h, b.h и c.h.

Последний файл main.c, который включает c.h.

Makefile, который я использовал следующий:

CXX  = g++ 
CXXFLAGS = -Wall -ansi -g 
CC  = gcc 
CCFLAGS = -g 
OBJS  = main.o a.o b.o c.o 

exec : $(OBJS) 
    $(CXX) -o [email protected] $(OBJS) 

c.o: d.cpp b.h a.h 
    $(CXX) -c $(CXXFLAGS) $< 

a.o: a.h 
    $(CXX) -c $(CXXFLAGS) $< 

b.o: b.cpp a.h 
    $(CXX) -c $(CXXFLAGS) $< 

%.o : %.cpp 
    $(CXX) -c $(CXXFLAGS) $< 

%.o : %.c 
    $(CC) -c $(CCFLAGS) $< 

Может кто-то мне, где я ошибаюсь? Кроме того, как я могу изменить make-файл таким образом, чтобы я мог помещать файлы a, b, c и d во вложенную папку, не вызывая никаких проблем?

Спасибо!

EDIT: Это ошибка, я получаю:

g++ -o tester main.o a.o b.o c.o 
Undefined symbols for architecture x86_64: 
    "_crypto_aead_encrypt", referenced from: 
     _main in main.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [tester] Error 1 

Функция определена в объявленный в ч и определяется в d.cpp

+0

Можете ли вы сказать, какая у вас ошибка? –

+0

Вы уверены, что не можете компилировать, а не связывать? – MikeCAT

+0

Да, ошибка происходит во время связи. Я добавил ошибку. – user1382272

ответ

1

Наиболее вероятной причиной является то, что определения в гл включены по основному скомпилирован как extern «C» при компиляции main.c, но как C++ extern (name mangling) при компиляции в d.cpp.

(если ч это место, где crypto_aead_encrypt функция приходит от)

Простое решение было бы собрать все, как C++ (или переименовать основной в .cpp или скомпилировать main.c с $ {CXX } и добавьте «-x C++» в CXXFLAGS).

Не так простое решение требует компиляции c.h-методов как extern «C» при компиляции d.cpp - для этого требуется изменить c.h и/или d.cpp. Или предоставить C-оболочку для C++-методов, включенных в c.h.

+0

Спасибо, я попробую ваше решение! :) – user1382272

+0

Он отлично работает, спасибо! – user1382272

Смежные вопросы