无法使Makefile工作

时间:2013-10-08 16:34:49

标签: c++ c linker makefile

我在构建makefile时遇到问题。我的主文件是.cpp fie。在该文件中,有一个引用头文件helper_funcs.h的include。然后,此头文件声明各种函数,每个函数都在自己的.c文件中定义。我需要将.c文件编译成.o文件,将.o文件编译到helper_funcs库中,然后当然能够从.cpp文件中引用它们(我希望这有意义)。

这是我输入'make'时得到的:

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

编辑: 删除以前的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 $@ $^ $(LDFLAGS)

%: %.cpp helper_funcs.a
    g++ -Wall -O3 -o $@ $^ $(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 个答案:

答案 0 :(得分:1)

在编译为C ++的代码中,函数f1f2必须声明为extern "C"。您可以在头文件中创建条件以提供该标记。

E.g。

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

这样做的原因是C ++代码的编译方式是函数经历一个名为“name mangling”的过程,在链接器看到的符号中编码它们的完整类型,以便在编译单元之间实现重载解析。 C编译器不这样做,因为C没有重载的概念。因此,当从C ++代码调用C函数时,反之亦然,必须将该函数声明为具有C风格的链接。