[英]C++ how to create a 'global' library
我正在開發一個包含以下行的項目: #include <fftw3.h>
現在我可以簡單地下載並制作fftw 。 但是,我如何使其成為一個“全球”圖書館?
我已經嘗試將其添加到$PKG_CONFIG_PATH
但這似乎不起作用。 我經常main.c:30:10: fatal error: 'fftw3.h' file not found
這個錯誤: main.c:30:10: fatal error: 'fftw3.h' file not found
所以我的問題是:我需要在哪里制作fftw庫(或任何庫)才能使其全局可訪問?
注意:我可能會錯誤地使用全球一詞,在這種情況下,請讓我知道正確的術語是什么。
更新:命令是:
gcc -Wall -march=native -O3 -ffast-math `pkg-config --cflags fftw3` `pkg-config --cflags sndfile` -c -o main.o main.c
main.c
包含該行
#include <fftw3.h>
我不認為你的方式有一個確切的答案 - 沒有“全局”庫,因為“fftw3.h”是一個頭文件。
這里有3件事: 1)你在哪里找到頭文件 2)你在哪里找到靜態(或存根/導入)庫 3)你在哪里找到動態庫(在運行時)
對於1),答案是“取決於構建工具的配置”。 所以是2)。 對於3,它通常是“在路徑中,與可執行文件在同一文件夾中,在當前目錄中,或在特定於平台的目錄中”。 對於Windows,Linux或其他平台,它會略有不同。
簡而言之,您需要為它配置構建工具。
編輯:現在我們知道你的工具是什么,我建議你閱讀這個簡短的頁面,解釋GCC如何查找標題(你的.h文件)。 您可以將頭文件放在其中一個搜索路徑中(草率!,不推薦),或將“額外”頭文件放在您選擇的目錄中,並使用“-I”參數將其添加到編譯命令中。
beign能夠使用<file>
包含文件通常是不好的做法,它增加了同名文件變成ambiguos的風險(特別是在大項目上)。
您可以通過使用-I
編譯器選項指定其他全局包含目錄來實現此目的。 然而,沒有最好的方法來實現這一目標(這取決於項目的組織方式和規模如何)。
包括絕對路徑:
#include <file>
#include <somepath/file2>
優點:
缺點:
包含相對於源文件的路徑:
#include "../file"
#include "../somepath2/file2"
優點:
缺點:
當然,我更喜歡使用標准庫內容的絕對路徑,最后使用FEW其他依賴項,否則我只使用相對路徑。 您應該注意,當編譯器搜索全局包含文件時,它將搜索所有提供的-I
目錄,因此如果您濫用該功能,則可能會增加編譯時間。
當然,即使使用全局包含,我更喜歡只添加一個額外的目錄並組織它,以便編譯器不必猜測路徑
Include
+FolderNameSpace1
+FolderNameSpace2
所以我只需在包含時添加命名空間
#include <FolderNameSpace1/File1>
一些開源項目,考慮到這個問題,但是由於並非所有人都願意花太多時間組織文件夾結構,他們的開發人員使用更簡單的策略在Header文件名前加上一個后綴(以避免名稱沖突)。在Ogre的例子中你必須做:
#include <OgreFileName>
//or (depending on how your project is organized)
#include "../Deps/OgreFileName"
所以在一些前提下,回答你的問題 ,
您必須添加“全局包含目錄”包含您要使用的所有包含文件的目錄,因此,鑒於您正在使用GCC,您的項目組織如下:
Project
+FFWT
+includes
+yourfolder
+yoour files
你要做的就是:
gcc -Wall -march=native -O3 -ffast-math -I../FFWT/includes c -o main.o main.c
(我假設你從“你的文件夾”里面調用GCC)
如何添加其他全局包含目錄:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.