G++:无法与主可执行文件链接
g++ : can't link with a main executable file
我正在开发一个使用统计攻击破解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 <vector
和using namespace std
,您需要修复这些错误和任何其他类似的错误才能编译代码。
@Etan Reisner写道:
您可能还应该坚持拼写
bias
bias
,而不是在某些地方同时使用biais
。
OP写道:
我终于发现了错误,它在我的makefile中,这些行:
naiveAttack : $(EXEC_NAME_NAIVE) statAttack : $(EXEC_NAME_STATALGO)
因为可执行文件已经生成,之后又进行了另一次编译,所以它生成了这个错误,为了获得更多信息,我可以为那些有这种错误的人提供新的makefile。
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 为什么C++可执行文件在与较新的libstdc++.so链接时运行得更快?
- 在链接可执行文件之前查找静态库未解析的依赖项
- mingw32-make 使用"MinGW Makefiles"生成器跟踪 CMAKE 无法将可执行文件链接到对象库
- python37.dll在可执行文件中未链接
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- 使用共享库编译可执行文件时仅链接所需的符号
- 使用 MINGW 和 CPLEX 库链接从 Linux 编译 Windows 可执行文件
- 将我的主输出库与测试可执行文件链接时出现问题
- cmake:构建可执行文件并库并链接它们
- 在可执行文件中使用带有符号链接的相对路径
- 使用LTO静态链接的可执行文件(链接时间优化):如何使用以前构建的库进行制作
- 将 CLANG 构建的可执行文件与 G++-v6 构建的 Boost 库链接时出错
- 当使用rpath时,C++可执行文件无法找到动态链接的共享库
- cusparse功能的多个定义错误在链接可执行文件中的cuda文件时
- GTEST测试项目链接链接到其他可执行文件
- Cmake不会将共享库的链接依赖关系传播到我的可执行文件
- G++:无法与主可执行文件链接
- 是否可以在运行时将可执行文件链接到具有相对路径的共享库