【问题标题】:g++ output: file not recognized: File format not recognizedg++ 输出:文件无法识别:文件格式无法识别
【发布时间】:2013-06-12 03:49:26
【问题描述】:

我第一次尝试使用多个文件构建程序。 只用 main.cpp 编译程序我从来没有遇到过任何问题。 使用以下命令,结果如下:

$ g++ -c src/CNumber.cpp src/CNumber.h -o src/CNumber.o
$ g++ -c src/CExprPart.cpp src/CExprPart.h -o src/CExprPart.o
$ g++ -c src/CExpr.cpp src/CExpr.h -o src/CExpr.o
$ g++ -c src/main.cpp -o src/main.o
$ g++ src/CNumber.o src/CExprPart.o src/CExpr.o src/main.o -o execprogram
src/CNumber.o: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status

什么可能导致此类错误,我应该如何处理? 使用带有 gcc 的 Linux Mint (Ubuntu/Linaro 4.7.2-2ubuntu1)。 谢谢

【问题讨论】:

  • 这样在编译命令行中包含头文件有点奇怪。
  • 你是对的,这就是问题所在。谢谢。

标签: gcc build g++ makefile


【解决方案1】:

这是错误的:

 g++ -c src/CNumber.cpp src/CNumber.h -o src/CNumber.o

您不应该“编译” .h 文件。这样做将创建预编译的头文件,这些文件不用于创建可执行文件。 以上应该只是

 g++ -c src/CNumber.cpp -o src/CNumber.o

与编译其他 .cpp 文件类似

【讨论】:

  • 所以,据我了解,由于#include指令,builder能够自己找到这些头文件,对吧?
  • @user2489350 是的。取决于他们所在的位置。您可以使用 gcc/g++ 的 -I 参数指定其他路径来搜索 #include 文件
【解决方案2】:

我在构建某些东西时遇到了这个错误 - 它原来是由于之前的构建在将源文件编译为 .o 文件时失败 - 那个 .o 文件不完整或损坏,所以当我尝试另一个构建它时在那个文件上给出了这个错误。

解决方案是删除 .o 文件(或运行 make clean,如果您有带有该目标的 makefile)。

【讨论】:

  • 也解决了我的问题。
【解决方案3】:

尝试将以下所有文件放在一个目录中:

example.cpp:

#include<iostream>
#include<string>

#include "my_functions.h"

using namespace std;

int main()
{
    cout << getGreeting() << "\n";

    return 0;
}

my_functions.cpp:

#include<string>
using namespace std;

string getGreeting()
{
    return "Hello world";
}

my_functions.h:

#ifndef _MY_FUNCTIONS_H
#define _MY_FUNCTIONS_H

#include<string>
using namespace std;

string getGreeting();

#endif

然后发出这些命令:

$ g++ example.cpp my_functions.cpp -o myprogram
~/c++_programs$ ./myprogram
Hello world

【讨论】:

  • 感谢您的回复。它构建良好。如果我只使用 ./myprogram 而不是你的第二行,我会得到正确的输出(hello world)
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2011-05-25
相关资源
最近更新 更多