好的,所以已经有一段时间了,我遇到#includes问题
所以我正在做
#include "someheader.h"
但它给了我
fatal error: someheader.h: No such file or directory
我想你可以说它是一个系统范围的库。 我正在运行arch linux,我从repo安装了库,我认为.h文件位于/ usr / include。
我可以将所有头文件复制到我的代码所在的文件夹中,但这将是一个黑客攻击。
什么是"权利"这样做的方法?
编辑:我说#h文件在/ usr / include中是不正确的,我的意思是库文件夹在那里 因此,Emile Cormier的答案在一定程度上起了作用。 现在的问题是头文件中有一些包含似乎从我尝试访问的方法看来那些包含没有发生 它给出了我的错误
undefined reference to Namespace::Class::method()
编辑: 好的,最后的答案是:
#include <library_name/someheader.h>
用
编译g++ code.cpp -llibrary_name
答案 0 :(得分:7)
您将#include <someheader.h>
用于系统位置的头文件。
#include "someheader.h"
会尝试将文件someheader.h包含在.c文件的目录中。
除了包含头文件外,还需要在库中进行链接,这是使用-l参数完成的:
g++ -Wall youprogram.cpp -lname_of_library
不这样做是“未定义引用..”链接器错误的原因。
答案 1 :(得分:4)
有时,库的头文件安装在/usr/include/library_name
中,因此您必须包含以下内容:
#include <library_name/someheader.h>
使用文件管理器(或控制台命令)在系统上找到头文件,看看是否应在头文件名前加上目录名。
您获得的undefined reference
错误是链接器错误。您收到此错误是因为您没有在libsynaptics中连接您的程序,因此链接器无法找到您正在使用的libsynaptics函数的“实现”。
如果您使用GCC从命令行进行编译,则必须在libsynaptics库中添加-lsynaptics
选项以进行链接。如果您使用的是IDE,则必须找到可以指定要链接的库并添加synaptics的位置。如果您正在使用makefile,则必须修改链接器标志列表,以便添加-lsynaptics
。
有关使用GCC链接到库的信息,请参阅此tutorial。
答案 2 :(得分:1)
快速解决方法是使用:
#include <someheader.h>
假设someheader.h
在标准包含位置(找到它在shell中使用命令locate someheader.h
。如果它在/usr/include
中它位于标准位置。如果它位于/usr/include
的子目录中,您只需要将/usr/include
指令中的目录部分添加到#include
(例如#include <fancy_lib/someheader.h>
)
然而,这只是故事的一半。您还需要以定位给定库的方式设置构建系统,并将其包含路径(存储头文件的路径)添加到编译器命令(gcc
{{1} }})。这样,您还可以通过在构建系统中配置它们来构建不同版本。如果库不是仅标头,则还必须将其添加到链接器依赖项。如何在构建系统中实现这一点最好通过查阅其文档来找到。