目前,我正在学习c ++和关于模块化过程的问题。假设我想编写一个函数来添加两个或三个数字。为此,我写了以下头文件:
// Sum2.hpp
//
// Preprocessor directives; ensures that we do not include a file twice
// (gives compiler error if you do so)
#ifndef Sum2_HPP
#define Sum2_HPP
/////////// Useful functions //////////////////
// Max and Min of two numbers
double Sum2(double x, double y);
// Max and Min of three numbers
double Sum2(double x, double y, double z);
////////////////////////////////////////////////
#endif
这只是声明。在单独的文件中,我指定了函数:
// Sum2.cpp
// Code file containing bodies of functions
//
#include "Sum2.hpp"
/////////// Useful functions //////////////////
// Sum of two numbers
double Sum2(double x, double y)
{
return x+y;
}
// Sum of three numbers
double Sum2(double x, double y, double z)
{
return Sum2(Sum2(x,y),z);
}
然后,在主程序中我想使用这些函数:
// main.cpp
#include <iostream>
#include "Sum2.hpp"
int main()
{
double d1;
double d2;
double d3;
std::cout<<"Give the first number ";
std::cin>> d1;
std::cout<<"Give the second number ";
std::cin>> d2;
std::cout<<"Give the third number ";
std::cin>> d3;
std::cout<<"The sum is: "<<Sum2(d1,d2);
std::cout<<"The sum is: "<<Sum2(d1,d2,d3);
return 0;
}
我使用g++ -c Sum2.cpp
生成目标代码Sum2.o
。当我想从主代码编译和创建可执行文件时,为什么会出现引用错误,即g++ -o main main.cpp
?
当我同时编译两个时,它正在工作,即g++ -o main main.cpp Sum2.cpp
。我想通过创建目标代码Sum2.o
并在main.cpp
中包含头文件,编译器将自动识别目标代码。为什么这不起作用?
答案 0 :(得分:5)
// Preprocessor directives; ensures that we do not include a file twice
// (gives compiler error if you do so)
实际上,它不会给编译器错误。它不会做任何事情。
至于你的实际问题,与其他语言不同,c ++不会试图为你找到你的目标文件。你必须告诉编译器他们在哪里。对于这个应用程序,你应该像这样编译它:
g++ -c main.cpp
g++ -c Sum2.cpp
g++ -o main main.o Sum2.o
前两个实际编译代码。第二个将代码链接在一起以生成可执行文件。如果你执行
g++ -o main main.cpp Sum2.cpp
编译器会自动为您执行这两个步骤。它适用于小型项目,但对于较大的项目,除非发生变化,否则不希望运行所有步骤。
现在,你可能会觉得这很痛苦。你是对的。这就是为什么有各种工具,如CMake,Scons,Jam,Boost.Build,旨在使构建C ++项目更容易。