【问题标题】:Inclusion of only header files does not run the program仅包含头文件不会运行程序
【发布时间】:2013-07-10 03:08:52
【问题描述】:

我正在使用库名称 cpt 在 Ubuntu 中运行我的程序。我从库中包含了所需的头文件,但程序无法运行,因为它无法访问头文件中的函数。 (它显示错误)我还必须包含 .cpp 文件,其中包含函数的完整定义。 我现在通过包含与所需标头关联的 .cpp 文件来运行我的程序。尽管编译时我有 -I/Desktop/cpt,但为什么我会收到此错误?

【问题讨论】:

  • 我不知道你想说什么。包含头文件和程序不工作之间有很多步骤。
  • 我只是为了更好的解释而对其进行了编辑。
  • 您是否包含库的标题但未链接库?您是否收到链接器错误“未找到函数定义”?
  • 是的,我收到“未定义的 -function- 引用”错误。链接库 - 您的意思是在执行程序时包含 .cpp 文件的路径吗?

标签: c++ inclusion


【解决方案1】:

您不应该包含 .cpp 文件,它们应该被编译,您应该向编译器指定要编译哪些 .cpp 文件,以及在哪里可以找到 .cpp 文件所需的 .h 文件。

【讨论】:

  • 在我的程序中,我包含了标题“linalg.hpp”,在编译时,我使用了“g++ lin.cpp -o linex -I/Desktop/cpt”,其中 cpt 是 linalg.cpp 所在的文件夹位于。如何在一次执行中编译我的程序所需的所有 .cpp 文件?
  • 你需要一个makefile,一个makefile包含你要给你的编译器的所有命令(例如g++)。创建 makefile 时,您只需在控制台中键入“make”即可编译代码。您还可以使用通配符命令告诉编译器编译目录中的所有 .cpp 文件,例如编译源目录中的所有 .cpp 文件,您可以键入:$(wildcard source/*.cpp),您的生成文件可能如下所示: SRC = $(wildcard source/*.cpp) LIB = -some_Lib_that_you_need all: g++ $(SRC) -o outputName $(LIB)
【解决方案2】:

也许您应该将您的程序与相应的共享/静态库链接,该库提供头文件中声明的那些函数的实现?

【讨论】:

  • “链接程序”是什么意思 - 您是要在编译或其他任何内容时提及包含路径吗?我已经包含了与包含我需要的函数的头文件关联的 .cpp 文件的路径。
  • 我的意思是,也许 .cpp 文件应该已经编译并作为库提供给您,您必须在创建最终可执行文件时将其与代码链接。你的情况是这样吗?
【解决方案3】:

Vladimirm 是正确的,您不需要#include .cpp 文件。头文件应该在有或没有相关联的 .cpp 文件的情况下进行编译。所有 .cpp 文件在称为链接的过程中链接在一起,但头文件在链接期间为函数提供原型。

您是否在#include 周围使用尖括号?例如

#include <mylib.h> 

如果是这样,您可能会考虑切换到双引号,例如

#include "mylib.h"

根据您引用的源文件所在的位置,这可能是问题所在。

【讨论】:

  • 我正在使用 "filename.h" 。我的头文件和相关的 .cpp 文件位于我运行程序的同一目录中。同样在编译时,我提到了包含路径。程序仍然没有调用头文件中的函数。我必须包含 .cpp 文件,然后程序才会在头文件中调用所需的函数。这就是我想知道的原因?
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2014-12-02
相关资源
最近更新 更多