2016-03-11 11 views
1

Я кодирую в C++ и для этого отлично работает makefile. Затем, для цели проекта, мне пришлось выйти в интернет и найти код, чтобы делать то, что я хотел сделать. Выключает доступные файлы C-файлов, а также файлы C++. Когда, пытаясь скомпилировать сейчас, у меня есть этот Undefined символы для ошибки архитектуры x86_64. И я уверен, что это потому, что я неправильно адаптировал свой make-файл. Я изо всех сил пытаюсь найти ответы, но ничего не работает для меня. Может быть, если кто-то взглянет на этот make-файл, это будет проще, я думаю. Также я заметил, что ни один из файлов .o не создан для моих файлов .c, но они сделаны для .cppВключить файлы C в C + + makefile

Надеюсь, кто-то может помочь. Я застрял на нем в течение 3 дней

##### Configurable options: 

# --------------------------------------------------------------------- 
# Compiler section 
# --------------------------------------------------------------------- 

## Compiler: 
CC=gcc 
#CC=cc 
CPP=g++ 

## Compiler flags: 

# GCC: (also -march=pentium etc, for machine-dependent optimizing) 
CFLAGS=-Wall -O3 -fomit-frame-pointer -funroll-loops 
LDFLAGS=-L/usr/local/lib 
LIBS=-lopenbabel 
CPPFLAGS=$(CFLAGS) -I Project/Lib/openbabel-2.0/ -I ProjectCode/Include/ -I ProjectCode/Lib/boost_1_60_0/ 
CXXFLAGS=-Wall -g -std=c++11 -I. 

# GCC w/ debugging: 
#CFLAGS=-Wall -g -DINLINE 

# Compaq C/Digital C: 
#CFLAGS=-arch=host -fast 

# SunOS: 
#CFLAGS=-fast 

## Program options: 

# Enable long options for cl (eg. "cl --help"), comment out to disable. 
# Requires getopt_long(3) (a GNU extension) 
LONGOPTS = -DENABLE_LONG_OPTIONS 


# --------------------------------------------------------------------- 
# Directories section 
# --------------------------------------------------------------------- 


OBJFILES = ProjectCode/Objects/Project.o ProjectCode/Objects/stdafx.o ProjectCode/Objects/BoxTools.o ProjectCode/Objects/TanimotoStruct.o 
COBJFILES = ProjectCode/Objects/cliquer.o ProjectCode/Objects/graph.o ProjectCode/Objects/reorder.o 

EXEC = Project 



# --------------------------------------------------------------------- 
# Compilation section 
# --------------------------------------------------------------------- 

ProjectCode/Objects/%.o: ProjectCode/Source/%.c 
$(CC) -o [email protected] -c $< $(CFLAGS) $(LIBS) 
ProjectCode/Objects/%.o: ProjectCode/Source/%.cpp 
$(CPP) $(CPPFLAGS) -o [email protected] -c $< 
Project: $(OBJFILES) 
$(CPP) $(LDFLAGS) -o [email protected] $^ $(CXXFLAGS) $(LIBS); 


# --------------------------------------------------------------------- 
# Cleaning section 
# --------------------------------------------------------------------- 

clean: 
    rm -f ProjectCode/Objects/*.o $(EXEC) 
+0

Вы убедились, что 'extern 'C" {'используется, когда вы ссылаетесь на заголовки функций C из вашего кода на C++? –

+0

Да, это включено как указано ниже: extern "C" { #include "cliquer.h" } – ChrisTremblay

+0

Имейте в виду, что в соглашениях 'make' /' autotools' CPP = ваш препроцессор C. CXX = ваш компилятор C++. –

ответ

1

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

Project: $(OBJFILES) 
    $(CPP) $(LDFLAGS) -o [email protected] $^ $(CXXFLAGS) $(LIBS); 

Но это, вероятно, должен выглядеть следующим образом:

Project: $(OBJFILES) $(COBJFILES) 
    $(CPP) $(LDFLAGS) -o [email protected] $^ $(CXXFLAGS) $(LIBS); 

Также на данный момент каждый из ваших %.o файлов зависит как в %.cpp и %.c. Вы захотите их каким-то образом отделить, иначе вы просто получите ошибки относительно какого-либо правила, чтобы сделать другие цели.

+0

Здравствуйте, Во-первых, спасибо за помощь. Я попробовал ваше решение, и он избавил меня от большинства ошибок архитектуры, но у меня есть некоторые, но я буду изучать это. Для второго пункта вы имеете в виду что-то подобное ?: cliquer.o graph.o reorder.o: cliquer.h set.h graph.h misc.h reorder.h Makefile cliquerconf.h – ChrisTremblay

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