未找到 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 确实存在于 .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/universe
或raring/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 头文件的主要内容,如果未能解决你的问题,请参考以下文章