我正在开发一个使用统计攻击来破解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
#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
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
所以我希望得到你的帮助,找出出现这个错误的原因。
感谢。
答案 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 <vector
和using namespace std
- 您需要修复这些以及任何其他类似错误才有可能编译代码。
@Etan Reisner写道:
OP写道:你也应该坚持拼写
bias
bias
,而不是在某些地方使用biais
。
我终于找到了错误,它在我的makefile中,那些行:
naiveAttack : $(EXEC_NAME_NAIVE) statAttack : $(EXEC_NAME_STATALGO)
因为已经生成了可执行文件,并且之后又进行了另一次编译,所以它会生成此错误,因为我可以为那些有这种错误的人提供新的makefile。