我正在开发一个使用统计攻击来破解 wep key 的应用程序。
当我用我的 makefile 编译时(如上)我得到这个错误:
ld: can't link with a main executable file 'execStatAttack' for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation) make: * [statAttack] Error 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
- 和生成文件:
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++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix
所以我希望得到您的帮助,找出出现此错误的原因。
谢谢。
最佳答案
这个错误通常意味着你在编译一个简单的程序时缺少一个-c
,像这样:
%.o: %.c
$(CC) $(CFLAGS) -o $@ $^
Program: main.o
$(CC) $(LDFLAGS) -o $@ $^
第一条规则是按照您的要求构建 main.o
,但它不是目标文件,而是完整的、已编译和链接的程序。
当第二条规则试图将其用作目标文件时,链接器发现它根本不是目标文件并产生“无法与主可执行文件链接”。
显然对于一个更复杂的程序,一个有多个目标文件或依赖库的程序,它不能只从一个源文件构建一个可执行文件,所以你会得到一个不同的错误并且永远不会达到链接规则。
当然,解决方案是在第一条规则中添加-c
,以便第一次调用只编译而不链接,生成一个实际的目标文件。
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $^
关于c++ - g++ : can't link with a main executable file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23132047/