C ++如何创建一个全球性的'图书馆

时间:2016-05-24 10:12:04

标签: c++

我正在开发一个包含以下行的项目:django.template.context_processors.request

现在我可以简单地下载并制作fftw。但是我如何才能使它成为一个全球性的'库中?

我尝试将其添加到TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True, 'DIRS': ( PROJECT_DIR.child('templates'), ), 'OPTIONS': { 'context_processors': [ 'django.contrib.auth.context_processors.auth', 'django.template.context_processors.debug', 'django.template.context_processors.i18n', 'django.template.context_processors.media', 'django.template.context_processors.static', 'django.template.context_processors.tz', 'django.contrib.messages.context_processors.messages', 'django.template.context_processors.request', ], 'debug': DEBUG } }, ] ,但这似乎不起作用。我经常遇到这个错误:#include <fftw3.h>

所以我的问题是:我需要在哪里制作fftw库(或任何图书馆)才能使其全局可访问?

注意:我可能会错误地使用全球一词,在这种情况下,请告诉我正确的术语是什么。

更新:命令为:

$PKG_CONFIG_PATH

main.c:30:10: fatal error: 'fftw3.h' file not found包含

gcc -Wall -march=native -O3 -ffast-math `pkg-config --cflags fftw3` `pkg-config --cflags sndfile` -c -o main.o main.c

2 个答案:

答案 0 :(得分:0)

我不认为你提出的方式有一个确切的答案 - 没有&#34;全球&#34;库,因为&#34; fftw3.h&#34;是一个头文件。

这里有三件事: 1)您找到标题文件的位置 2)您在哪里找到静态(或存根/导入)库 3)您在哪里找到动态库(在运行时)

对于1),答案是&#34;取决于构建工具的配置&#34;。 所以是2)。对于3,它通常是&#34;在路径中,与可执行文件在同一文件夹中,在当前目录中,或在特定于平台的目录中#34;。对于Windows,Linux或其他平台,它会略有不同。

简而言之,您需要为其配置构建工具。

编辑: 既然我们知道你的工具是什么,我建议你阅读这个简短的页面,解释GCC如何查找标题(你的.h文件)。您可以将头文件放在其中一个搜索路径中(草率!,不推荐),或者将您的&#34;额外&#34;在您选择的目录中的标题,并使用&#34; -I&#34;将其添加到编译命令中参数。

https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

答案 1 :(得分:0)

beign能够使用<file>包含文件通常是不好的做法,它会增加同名文件成为ambiguos的风险(特别是在大型项目中)。

您可以通过使用-I编译器选项指定其他全局包含目录来实现此目的。然而,没有最好的方法来实现这一目标(这取决于项目的组织方式和规模)。

按绝对路径加入:

#include <file>
#include <somepath/file2>

<强>优点:

  • 源代码结构更灵活(您可以在不担心破坏编译的情况下移动文件)

<强>缺点:

  • 文件之间更有可能发生名称冲突

按路径相对于源文件包含:

#include "../file"
#include "../somepath2/file2"

<强>优点:

  • 没有机会发生名称冲突,只有1个文件给出任何相对路径

<强>缺点:

  • 您无法移动文件,否则需要更改相对路径(但IDE的重构工具可能会有所帮助)

我绝对喜欢使用标准库内容的绝对路径,最后 FEW 其他依赖项,否则我只使用相对路径。您应该注意,当编译器搜索全局包含文件时,它将搜索所有提供的-I目录,因此如果您滥用该功能,则可能会增加编译时间。

当然即使使用全局包含,我更喜欢只添加一个额外的目录并组织它以便编译器不必猜测路径

Include
  +FolderNameSpace1
  +FolderNameSpace2

所以我只需在包含

时添加命名空间
#include <FolderNameSpace1/File1>

一些开源项目,考虑到这个问题,但是由于并非所有人都愿意花太多时间组织文件夹结构,他们的开发人员使用更简单的策略在Header文件名前加一个后缀(以避免名称冲突) )..在食人魔的例子中你必须这样做:

#include <OgreFileName>
//or (depending on how your project is organized)
#include "../Deps/OgreFileName"

所以在一些前提下,回答你的问题

你必须添加&#34;全局包含目录&#34;包含您要使用的所有包含文件的目录,因此,如果您正在使用GCC,并且您的项目组织如下:

Project
  +FFWT
    +includes
  +yourfolder
    +yoour files
你只需这样做:

gcc -Wall -march=native -O3 -ffast-math -I../FFWT/includes c -o main.o main.c

(我假设您从内部调用GCC&#34;您的文件夹&#34;)

如何添加其他全局包含目录: