【问题标题】:Linking multiple object files in c++ but no ouput在c ++中链接多个目标文件但没有输出
【发布时间】:2012-06-24 21:18:32
【问题描述】:

我是 C++ 编程的新手,并且了解 C++ 的基础知识。我正在尝试链接三个文件,但我无法获得输出。我现在正在研究这本书 c++ cookbook

假设我们有文件 a.hpp a.cpp, b.hpp b.cpp,c.hpp c.cpp,代码如下:

a.hpp

#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED
void a();
#endif

a.cpp

#include "a.hpp"
#include <iostream>
void a()
{
    std::cout<<"a \n ";
}

b.hpp

#ifndef B_HPP_INCLUDED
#define B_HPP_INCLUDED
void b();
#endif

b.cpp

#include "b.hpp"
#include <iostream>
void b()
{
    std::cout<<"b \n ";
}

c.hpp

#ifndef C_HPP_INCLUDED
#define C_HPP_INCLUDED
void c();
#endif

c.cpp

#include "a.hpp"
#include "b.hpp"
#include "c.hpp"
void c()
{
    a();
    b();

}

int main()
{
    c();
    return 0;
}

我已经在一个文件夹中创建了所有文件,我用来编译和链接它们的命令是

$:g++ -c -Wall a.cpp b.cpp c.cpp
$:g++ -o -Wall a.o b.o c.o
$:./a.out

我期待着出局

a
b

但根本没有输出。请大家帮我解决这个问题。

【问题讨论】:

  • 第一段提到了ab.hab.c,但是没有用到。构建命令是否正确?忽略这两个文件,一切看起来都是正确的,应该可以按预期工作。

标签: c++ linker g++


【解决方案1】:

g++ 命令行中删除-o

您当前告诉g++ 将您的对象链接到一个名为-Wall 的文件中。所以替代解决方案是调用./-Wall 而不是./a.out

由于字符串中的空格(" \n ""\n"),您仍然无法获得准确的预期输出。你也可能想要替换:

std::cout << "something \n";

std::cout << "something" << std::endl;

如果您想立即在屏幕上显示数据(刷新)。另见C++: “std::endl” vs “\n”

【讨论】:

  • 奇怪的是,链接问题中的最佳答案与您所说的相矛盾...
  • 你能加个报价吗?从我读到的内容来看,它们并不矛盾,至少公认的不矛盾。它只是说如果要刷新输出,请使用std::endl。在命令行输出中,我通常这样做是为了避免在崩溃或任何情况下丢失(调试)数据。
  • 这与您声称endl 有助于可移植性的说法相矛盾。这种说法破坏了一个很好的答案。
  • 嗯,我是这么认为的。但是,再次阅读链接的答案表明我错了,要立即编辑。
  • @JonasWielicki 谢谢 :) 当我输入 ./-Wall 时,我能够得到输出。但我实际上使用它是为了让编译器可以显示警告(如果有的话)。请问让我知道 -Wall 的正确用法?非常感谢:)
【解决方案2】:
$:g++ a.o b.o c.o -o your_output_program_name -Wall

尝试使用此命令。你肯定会让所有事情都正常工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2014-08-09
    相关资源
    最近更新 更多