Sou*_*ouf 6 c++ xcode makefile g++ vector
我正在开发一个使用统计攻击来破解wep密钥的应用程序.
当我使用我的makefile(上面)编译时,我收到此错误:
ld:无法与架构x86_64的主可执行文件'execStatAttack'链接
clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)make:* [statAttack]错误1
我的项目包含这些文件:
statAttack.cpp:包含main函数,使用上面的文件
rc4.h + rc4.cpp:具有那些功能
Run Code Online (Sandbox Code Playgroud)#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
Run Code Online (Sandbox Code Playgroud)#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
Run Code Online (Sandbox Code Playgroud)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
配置为: - 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
所以我希望得到你的帮助,找出这个错误出现的原因.
谢谢.
此错误通常意味着您-c在编译一个简单程序时会丢失a ,例如:
%.o: %.c
$(CC) $(CFLAGS) -o $@ $^
Program: main.o
$(CC) $(LDFLAGS) -o $@ $^
Run Code Online (Sandbox Code Playgroud)
发生的事情是,第一个规则是按照main.o您的要求进行构建,但实际上它不是完整的,已编译和链接的程序,而不是目标文件。
当第二条规则试图将其用作目标文件时,链接器会发现它根本不是目标文件,并产生“无法与主可执行文件链接”的信息。
显然,对于更复杂的程序,即具有多个目标文件或库依赖关系的程序,它将无法仅从一个源文件构建可执行文件,因此您将得到一个不同的错误,并且永远无法达到链接规则。 。
当然,解决方案是添加-c到第一个规则,以便第一个调用仅编译而不链接,从而生成实际的目标文件。
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $^
Run Code Online (Sandbox Code Playgroud)