g ++:无法与主可执行文件链接

时间:2014-04-17 11:34:27

标签: c++ xcode vector makefile g++

我正在开发一个使用统计攻击来破解wep密钥的应用程序。

当我使用我的makefile(上面)编译时,我收到此错误:

  

ld:无法链接主执行文件'execStatAttack'   架构x86_64

     

clang:错误:链接器命令失败,退出代码为1(使用-v查看   调用)make: * [statAttack]错误1

我的项目包含这些文件:

  • statAttack.cpp:包含main函数,使用上面的文件

  • rc4.h + rc4.cpp:具有这些功能

#include <iostream>
#include <stdlib.h>
#include <stdio.h
#include <vector

#ifndef RC4
#define RC4

using namespace std
int* rc4(int);
int random_byte();
vector<int> cipher_mess_seq (long, int);

#endif
  • bias.h + bias.cpp:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <utility>
#include <fstream>
#include <vector>
#include <string>

#ifndef BIAIS
#define BIAIS

using namespace std;

typedef pair<int,double> IntegerDoublePair;
vector<IntegerDoublePair> get_bias (string, int);
int compareTo (double, double);
vector<IntegerDoublePair> get_all_biases(string);

#endif
  • 和makefile:
CC = g++
CFLAGS = -Wall -g
LDFLAGS = -lm 
EXEC_NAME_NAIVE = execNaiveAttack
EXEC_NAME_STATALGO = execStatAttack
OBJ_FILES_NAIVE = naiveAttack.o biais.o rc4.o
OBJ_FILES_STATALGO = statAttack.o biais.o rc4.o

naiveAttack : $(EXEC_NAME_NAIVE)

statAttack : $(EXEC_NAME_STATALGO)

$(EXEC_NAME_NAIVE) : $(OBJ_FILES_NAIVE)
   $(CC) $(OBJ_FILES_NAIVE) $(LDFLAGS) -o $(EXEC_NAME_NAIVE)

$(EXEC_NAME_STATALGO) : $(OBJ_FILES_STATALGO)
   $(CC) $(OBJ_FILES_STATALGO) $(LDFLAGS) -o $(EXEC_NAME_STATALGO)

%.o : %.cpp
   $(CC) $(CFLAGS) -o $@ -c $<

clean :
   rm -f $(OBJ_FILES_NAIVE) $(OBJ_FILES_STATALGO)

mrproper: clean
   rm -rf $(EXEC_NAME_NAIVE) $(EXEC_NAME_STATALGO)

这是我的配置(终端):

  

==&GT; g ++ --version

     

配置:   --prefix = / Applications / Xcode.app / Contents / Developer / usr --with-gxx-include-dir = / usr / include / c ++ / 4.2.1

     

Apple LLVM 5.1版(clang-503.0.40)(基于LLVM 3.4svn)

     

目标:x86_64-apple-darwin13.1.0

     

线程模型:posix

所以我希望得到你的帮助,找出出现这个错误的原因。

感谢。

2 个答案:

答案 0 :(得分:6)

此错误通常意味着您在编译简单程序时错过-c,如下所示:

%.o: %.c
    $(CC) $(CFLAGS) -o $@ $^
Program: main.o
    $(CC) $(LDFLAGS) -o $@ $^

正在发生的事情是,第一条规则正在构建main.o,就像您提出的那样,但它不是一个目标文件,而是实际上是完整的,已编译和链接的程序。

当第二个规则尝试将其用作目标文件时,链接器发现它根本不是目标文件,并且生成&#34;不能与主可执行文件链接。 #34;

显然对于一个更复杂的程序,一个具有多个目标文件或具有库依赖性的程序,它将无法仅从一个源文件构建可执行文件,因此您将得到不同的错误并且永远不会得到链接规则。

当然,解决方案是将-c添加到第一个规则,以便第一次调用仅编译并且不链接,从而生成实际的目标文件。

%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $^

答案 1 :(得分:0)

(在评论中回答。见Question with no answers, but issue solved in the comments (or extended in chat)

@Paul R写道:

  

您的源文件中有几个拼写错误,例如: #include <vectorusing namespace std - 您需要修复这些以及任何其他类似错误才有可能编译代码。

@Etan Reisner写道:

  

你也应该坚持拼写bias bias,而不是在某些地方使用biais

OP写道:

  

我终于找到了错误,它在我的makefile中,那些行:    naiveAttack : $(EXEC_NAME_NAIVE) statAttack : $(EXEC_NAME_STATALGO)    因为已经生成了可执行文件,并且之后又进行了另一次编译,所以它会生成此错误,因为我可以为那些有这种错误的人提供新的makefile。