未找到 NTL 头文件

Posted

技术标签:

【中文标题】未找到 NTL 头文件【英文标题】:NTL header file not found 【发布时间】:2014-01-30 12:52:08 【问题描述】:

我已经在我的 Ubuntu 上下载并安装了 NTL 库。我目前正在使用 gedit 编写我的程序,并将这个 ZZ.h 标头包含在我的程序中。这就是我在终端中编译程序的方式:- g++ keygen.cpp -o keygen -I ../include -L ../lib -lntl -lm

我很确定这条线是正确的,但由于某些未知原因,我收到以下错误:

KeyGen.cpp:9:20: error: NTL/ZZ.h: No such file or directory
KeyGen.cpp:15: error: expected constructor, destructor, or type conversion before ‘int’

解决方案对我来说似乎很简单:将 NTL 库直接添加到我的程序文件夹中。我就是这样做的,但我仍然得到同样的错误。

【问题讨论】:

g++ 用于标题的路径中是否真的有 NTL/ZZ.h 标题。尝试运行cpp -I ../include -x c++ -v 以获取包含目录的完整列表 @user3159253 的意思是说我必须在包含目录中看到 NTL/ZZ.h? 当然可以。在其中一个包含目录中应该有一个名为 NTL 的子目录,其中包含可读的 ZZ.h。 你是如何安装 NTL 库的?来自包装还是来自来源?我检查了 ZZ.h 确实存在于 /include/NTL/ @user3159253 我按照 NTL 网站上的说明安装了库。我在.cpp 文件夹中创建了一个名为“include”的文件夹,并且已经在该文件夹中包含了 NTL 库。既然看不到..我该怎么办? 【参考方案1】:

如果您不需要最新 (6.0.0) 版本的 NTL,您可以在 Ubuntu 中执行以下操作:

user@host:~$ sudo apt-get install libntl-dev 阅读包裹清单...完成 构建依赖树 读取状态信息...完成 将安装以下额外软件包: libntl-5.4.2 将安装以下新软件包: libntl-5.4.2 libntl-dev 0 升级,2 新安装,0 删除,112 未升级。 需要获得 2,035 kB 的档案。 此操作后,将使用 7,016 kB 的额外磁盘空间。 您要继续 [Y/n] 吗?是的 获取:1 http://ftp.de.debian.org/debian/squeeze/main libntl-5.4.2 amd64 5.4.2-4 [767 kB] 获取:2 http://ftp.de.debian.org/debian/squeeze/main libntl-dev amd64 5.4.2-4 [1,268 kB] 在 2 秒内获取 2,035 kB (1,017 kB/s) 选择以前取消选择的软件包 libntl-5.4.2。 (正在读取数据库...当前安装的 59184 个文件和目录。) 解压 libntl-5.4.2(来自 .../libntl-5.4.2_5.4.2-4_amd64.deb)... 选择以前取消选择的软件包 libntl-dev。 解压 libntl-dev(来自 .../libntl-dev_5.4.2-4_amd64.deb)... 无法写入日志,openpty() 失败(/dev/pts 未安装?) 设置 libntl-5.4.2 (5.4.2-4) ... 设置 libntl-dev (5.4.2-4) .. 用户@主机:~$

在您的系统中安装完整编译的 NTL 库和所有开发头文件之后,您可以使用它编译您的程序而无需任何额外的 -I

如果您需要发行版的更新版本(查看http://packages.ubuntu.com/en/source/trusty/ntl),您可以尝试自己构建库包。

【讨论】:

我试过你的方法,但终端告诉我找不到包。 嗯,你有什么 ubuntu? 好吧,您可以运行apt-cache policy 来检查正在使用的 apt 存储库。确保universe 存储库已打开(输出中的第三个字段,例如saucy/universeraring/universe。然后尝试执行apt-cache search libntl-dev 我尝试了search,但没有任何反应。是的,universe repo 在第三个输出中。 我认为它已经解决了。现在当我再次编译时,它给了我另一个错误:undefined reference to NTL..【参考方案2】:

您尝试编译和输出可执行文件的问题似乎是编译器在获取对象.o 文件后无法链接必要的库。

许多人经常通过首先编译g++ -c 然后通过链接可执行文件g++ -o 的库来分离两个阶段来测试故障点。尽管-Wall 开关并不总是有效,但尝试在编译期间为您提供尽可能多的信息也会有所帮助。

查看this 网页。至于使用不同的开关链接库尝试this网页。

我不确定这是否是一个错字;但我想知道交换机和目录之间的空间:-I ../include-L ../lib是问题所在。

【讨论】:

好吧,他还没有达到链接阶段。 KeyGen.cpp:9:20: error: NTL/ZZ.h: No such file or directory 是来自编译器的消息,更准确地说是来自预处理器的消息【参考方案3】:

你在cmets中说:

我在 .cpp 文件夹中创建了一个名为“include”的文件夹,并将 NTL 库包含在该文件夹中

但是你的编译命令说:

g++ keygen.cpp -o keygen -I ../include -L ../lib -lntl -lm.

在我看来,你的意思是:

g++ keygen.cpp -o keygen -I ./include -L ../lib -lntl -lm.
#                           ^^^^^^^^^

因为.. 上一级目录。

【讨论】:

以上是关于未找到 NTL 头文件的主要内容,如果未能解决你的问题,请参考以下文章

未找到 Xcode 链接的项目头文件

Visual Studio 未找到包含的定义

在现有 iOS 应用程序中集成 react-native(0.40.0) 后未找到 yoga/Yoga.h 头文件

Clang:找不到 C++11 头文件

Keil工程已包含头文件,但仍然提示未定义

头文件已经定义,但是在CPP文件中使用的话不能报错有未定义的字符