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

g++ : can't link with a main executable file

本文关键字:可执行文件 链接 G++      更新时间:2023-10-16

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

当我用我的makefile(上面)编译时,我得到了这个错误:

ld:无法链接到的主可执行文件"execStatAttack"体系结构x86_64

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

我的项目包含这些文件:

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

  • 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)

这是我的配置(终端):

===>g++——版本

配置为:--prefix=/Applications/Xcode.app/Contents/Developer/usr--带有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

所以我希望你能帮我找出这个错误出现的原因。

谢谢。

这个错误通常意味着在编译一个简单程序时缺少一个-c,类似于以下内容:

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

现在的情况是,第一条规则是按照您的要求构建main.o,但它实际上不是一个对象文件,而是一个完整的、经过编译和链接的程序。

当第二条规则试图将其用作对象文件时,链接器发现它根本不是对象文件,并产生"无法与主可执行文件链接"

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

当然,解决方案是将-c添加到第一条规则中,以便第一次调用只编译而不链接,从而生成实际的对象文件。

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

(在评论中回答。请参阅没有答案的问题,但在评论中解决了问题(或在聊天中扩展)

@Paul R撰文:

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

@Etan Reisner写道:

您可能还应该坚持拼写bias bias,而不是在某些地方同时使用biais

OP写道:

我终于发现了错误,它在我的makefile中,这些行:naiveAttack : $(EXEC_NAME_NAIVE) statAttack : $(EXEC_NAME_STATALGO)因为可执行文件已经生成,之后又进行了另一次编译,所以它生成了这个错误,为了获得更多信息,我可以为那些有这种错误的人提供新的makefile。