2013-10-08 5 views
1

У меня возникли проблемы с созданием файла makefile. Мой основной файл - .cpp fie. В этом файле есть include, который ссылается на заголовочный файл helper_funcs.h. Этот заголовочный файл затем объявляет различные функции, каждый из которых определяется в их собственном .c файле. Мне нужно скомпилировать файлы .c в .o-файлы, скомпилировать файлы .o в библиотеку helper_funcs и, конечно, иметь возможность ссылаться на них из файла .cpp (я надеюсь, что это имеет смысл).Не удается получить Makefile для работы

Это то, что я получаю, когда я типа «сделать»:

g++ -Wall -O3 -o chessboard chessboard.cpp helper_funcs.a -framework OpenGL -framework GLUT ld: warning: ignoring file helper_funcs.a, file was built for unsupported file format (0x2E 0x2F 0x2E 0x5F 0x43 0x53 0x43 0x49 0x78 0x32 0x32 0x39 0x2E 0x68 0x00 0x00) which is not the architecture being linked (x86_64): helper_funcs.a

EDIT: После удаления предыдущей сборки helper_funcs.a и перекомпиляции, ошибка выше ушла, но это то, что результаты :

g++ -Wall -O3 -o chessboard chessboard.cpp helper_funcs.a -framework OpenGL -framework GLUT Undefined symbols for architecture x86_64: "f1(char const*)", referenced from: _main in chessboard-MB9B95.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: *** [chessboard] Error 1

LDFLAGS = -framework OpenGL -framework GLUT 
CFLAGS = -c -g -Wall 

all: chessboard 

# Generic compile rules 
.c.o: 
    gcc -c -O -Wall $< 
.cpp.o: 
    g++ -c -Wall $< 

# Generic compile and link 
%: %.c helper_funcs.a 
    gcc -Wall -O3 -o [email protected] $^ $(LDFLAGS) 

%: %.cpp helper_funcs.a 
    g++ -Wall -O3 -o [email protected] $^ $(LDFLAGS) 

# Create archive 
helper_funcs.a: f1.o f2.o 
    ar -rcs helper_funcs.a $^ 

Вот начало chessboard.cpp:

#define GL_GLEXT_PROTOTYPES 
#include "chessboard.h" 
#include "helper_funcs.h" 

using namespace std; 

int main() 
{ 
     // ... 
     f1("arg"); 
     return 0; 
} 

helper_funcs.h:

#ifndef helper_funcs 
#define helper_funcs 

#include <stdio.h> 
#include <stdlib.h> 
#include <stdarg.h> 
#include <string.h> 
#include <math.h> 

#ifdef USEGLEW 
#include <GL/glew.h> 
#endif 
#define GL_GLEXT_PROTOTYPES 
#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 

void f1(const char* where); 
void f2(const char* format , ...); 

#endif 

Вот две из функций (они, очевидно, имеют более описательные имена, но я пытался быть вообще в первой, так что я буду придерживаться, что Во избежание путаницы):

f1.c

#include "helper_funcs.h" 

void f1(const char* where) 
{ 
    // blah blah blah 
} 

f2.c

#include "helper_funcs.h" 

void f2(const char* format , ...) 
{ 
    // blah blah blah 
} 
+1

У вас, похоже, есть версия 'helper_funcs.a', которая была построена на (или, по крайней мере, * для *) другой архитектуре. Удалите 'helper_funcs.a' и попробуйте' make' снова. – Beta

+0

Спасибо. Это определенно является частью проблемы. Теперь я вернулся туда, где был раньше, где я все еще не компилирую правильно. Мои вспомогательные функции, похоже, не видны основной программе. Я обновил свой OP, чтобы показать это «новое» сообщение об ошибке. Еще раз спасибо! – Alex

+0

Диск с комментариями: добавьте «чистую» цель для удаления всех вещей, которые можно построить. –

ответ

1

В коде, составленный, как C++, функции f1 и f2 должны быть объявлены extern "C". Вы можете сделать условие в файле заголовка, чтобы обеспечить эту маркировку.

E.g.

#ifdef __cplusplus 
extern "C" { 
#endif 

void f1(const char* where); 
void f2(const char* format , ...); 

#ifdef __cplusplus 
} 
#endif 

Причина этого заключается в том, что код C++ компилируется таким образом, что функции претерпевают процесс, называемый «имя коверканием» для кодирования их полного типа в символе, который видит линкер, чтобы обеспечить разрешение перегрузки через единицу компиляции. Компиляторы C этого не делают, поскольку C не имеет понятия перегрузки. Таким образом, при вызове функции C из кода на C++ или наоборот, функция должна быть объявлена ​​связью C-стиля.

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