Linux &引用;Exec格式错误";运行由g++;

Linux &引用;Exec格式错误";运行由g++;,linux,bash,makefile,Linux,Bash,Makefile,我的QTCreator生成的Makefile有问题。一切正常,除了当我尝试为自己的测试创建一个新的可执行文件时,我的终端显示:bash:./RunTests:无法执行二进制文件:Exec格式错误 下面是我的MakeFile规则的样子: TESTS: ../WannaBeRPG/testes.cpp ../WannaBeRPG/hero.h ../WannaBeRPG/charinterface.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o RunTests

我的QTCreator生成的Makefile有问题。一切正常,除了当我尝试为自己的测试创建一个新的可执行文件时,我的终端显示:
bash:./RunTests:无法执行二进制文件:Exec格式错误

下面是我的MakeFile规则的样子:

TESTS: ../WannaBeRPG/testes.cpp ../WannaBeRPG/hero.h ../WannaBeRPG/charinterface.h
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o RunTests ../WannaBeRPG/testes.cpp
CXX = g++
CXXFLAGS = -pipe -g -std=gnu++0x -Wall -W -fPIC $(DEFINES)
INCPATH = -I../WannaBeRPG -I. -I/usr/lib64/qt5/mkspecs/linux-g++
DEFINES = -DQT_QML_DEBUG
标志为:

TESTS: ../WannaBeRPG/testes.cpp ../WannaBeRPG/hero.h ../WannaBeRPG/charinterface.h
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o RunTests ../WannaBeRPG/testes.cpp
CXX = g++
CXXFLAGS = -pipe -g -std=gnu++0x -Wall -W -fPIC $(DEFINES)
INCPATH = -I../WannaBeRPG -I. -I/usr/lib64/qt5/mkspecs/linux-g++
DEFINES = -DQT_QML_DEBUG
如果这有什么帮助,这里是我的testes.cpp文件:

#include <gtest/gtest.h>
#include "hero.h"

TEST(teee, HPTEST)
{
    Hero myHero("Hika",150,100,0,0,0,0,0,0,0);
    EXPECT_EQ(100,myHero.getHP());
}

int main_tests(int argc, char* argv[])
{
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}
#包括
#包括“hero.h”
测试(三通、高压测试)
{
英雄myHero(“Hika”,150100,0,0,0,0,0,0);
EXPECT_EQ(100,myHero.getHP());
}
int main_测试(int argc,char*argv[])
{
测试:InitGoogleTest(&argc,argv);
返回运行所有测试();
}
我在用软呢帽。
你知道为什么会这样吗?此Makefile中的主exec工作完全正常

g++的
-c
参数告诉它不要链接二进制文件。因此,您的输出文件是一个对象文件,而不是一个可执行文件。

我不能100%确定为什么在您的情况下会发生这种情况,但要执行./RunTests,它必须具有执行权限,并且包含它的目录必须具有执行权限:$ls-l RunTests应返回类似-rwxr-xr-x或至少-rwx------或至少-r-x------的内容。还要检查找到它的目录:它还必须具有“x”的执行权限。“umask”变量的值可能有问题。也就是说,当创建一个新文件时,执行权限将从中剥离。读一下umask。@ThomasHedden,权限问题不会导致“Exec格式错误”。顺便说一句,处理此类问题时要采取的步骤之一是使用
文件运行测试来确定二进制文件的类型。是的,即使我将premissions更改为777也没关系,仍然是相同的错误@CharlesDuffy'file RunTest'打印我:“RunTests:ELF 64位LSB可重定位,x86-64,版本1(SYSV),未剥离”…现在,将该
文件的输出与工作链接可执行文件的输出进行比较。你会看到,上面说的是
可执行的
,而不是
可重定位的
。好吧,但是当我删除-c标志时,整个make进程崩溃,给了我很多未定义的引用,也就是说,一到“undefined ref.to main”不能在整个项目的main.cpp文件中再次定义。如果您的测试可执行文件没有
main
函数,您希望它如何运行?我明白了。为什么它会在所有这些未定义的情况下崩溃。但是refs(我的意思是如果我添加一个主函数来编译它)?我应该把它们单独链接到什么地方吗?任何需要链接到你的程序使用的函数的库都是需要链接到你的程序使用的函数的库。如果依赖项列表相同,请以链接主可执行文件时的相同方式对其进行处理。砰!就这样!非常感谢!:)