单独的标头文件及其逻辑在C 中

Separate header file and its logic in c++

本文关键字:文件 单独      更新时间:2023-10-16

请让我了解标头文件在C 中的工作方式。我正在使用OSX和G 编译器。我有

main.cpp

#include<iostream> 
#include "myfunc.hpp"
using namespace std;
int main() {
    square(10);
    return 0;
}

myfunc.hpp

#ifndef MYFUNC_HPP_
#define MYFUNC_HPP_
/*
void square(int x) {
    std::cout << x * x << std::endl;
};
*/
void square(int);
#endif // MYFUNC_HPP_

myfunc.cpp

#include<iostream>
#include "myfunc.hpp"
using namespace std;
void square(int x) {
    cout << x * x << endl;
}

现在,当我尝试使用 g main.cpp 进行编译时,它的给予

架构的未定义符号x86_64: "正方形(int(",从: _ main-088331.o中的曼 LD:符号(s(架构x86_64找不到符号 clang:错误:链接器命令因出口代码1失败(使用-V查看调用(

因为它找不到在myfunc.cpp中定义的 square 的函数定义。但是,如果我在标题文件中定义了Square函数,则可以使用它,因为现在它找到了函数定义。

我想使用main.cpp中的myfunc.cpp中定义的函数,因此我使用的是标题文件myfunc.hpp。我该如何实现?我在这里做错了吗?也许我的概念对标题并不清楚,因为我是C 编程的新手。

调用g++ main.cpp时,编译器将尝试编译和链接 ,但对于链接,它缺少包含包含定义定义的源或对象文件square。因此,它可以基于标题文件中给出的函数原型来编译main.cpp,但不能链接。

仅编译main.cpp

g++ -c main.cpp

编译并链接完整的程序写:

g++ main.cpp myfunc.cpp

有关包含多个翻译单元的程序的更多详细信息,例如,此链接。