2016-07-24 120 views
-1

所以我試圖用C++創建我自己的庫,並在另一個項目中使用它。 到目前爲止,它與示例代碼一起工作,但我必須在其自己的庫中包含其他庫。所以問題是,當我將頭文件包含在我的庫中時,頭文件中的包含路徑會混亂。 一個簡單的解決方案是添加搜索目錄,但我不認爲, 多數民衆贊成在應該如何解決。嵌套的C++庫包括

示例代碼 - 庫的頭文件:

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
int test(); 

源文件:

#include "sample.h" 
int test() { return 20; } 

現在,我想包括樣品

#include <sample.h> 
int main() { int a = test(); } 

該項目的問題,include將sample.h中的代碼直接複製到main.cpp和ot的搜索目錄中她的包含from sample.h不再被定義爲

回答

0

一個簡單的解決方案是添加搜索目錄,但我不認爲,它應該如何解決。

這當然是最簡單的解決方案,因爲它不需要修改代碼,通常是做一個可以接受的事情 - 但顯然這意味着該項目可以從glew.hglfw3.h


調用的函數

唯一的選擇是確保標題不包含在庫標題中,而是由源代碼包含。

IE:

庫頭:

int test(); 

圖書館來源:

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include "sample.h" 
int test() { return 20; } 

而該項目的源文件保持不變。

這要求在glew.hglfw3.h中定義的類型不是庫中公開的公共接口的一部分。

例如,如果你的圖書館有一個功能,如:

GLFWwindow* window = openWindow(...); 

您需要將其更改爲:

圖書館標題:

struct WindowHandle; 
WindowHandle* openWindow(...); 

圖書館來源:

struct WindowHandle{ 
    GLFWwindow* window; 
}; 

WindowHandle* openWindow(...){ 
    WindowHandle* result; 
    //... do stuff... 
    result->window = //whatever; 
    return result; 
} 

This approac h需要更改庫代碼,但具有圖書館用戶不能直接調用庫所依賴的東西(在這種情況下爲glew和glfw)的優點。如果你想支持多種平臺,這是特別有利的,你可以有一個通過glfw打開窗口的源文件,另一個使用直接的x。該庫的公共接口不需要改變以支持兩個後端。

如果您想了解更多關於這種方法嘗試搜索「不透明數據類型」

+0

哇感謝,這正是我一直在尋找。 還有一件事:到目前爲止,當我創建一個鏈接到我的引擎庫的項目時,我還必須鏈接到所有其他庫(glew32d,opengl32等)。 有沒有解決方案,它們會自動鏈接? –

+0

嗯,好問題。我自己也遇到了同樣的問題,並且只是鏈接到依賴關係。在像glew這樣的開放源代碼的情況下,你可以將它的源代碼包含在你的庫中,然後將它整合到一箇中(儘管這可能違反了他們的許可證,我沒有檢查過)。儘管源代碼不可用,但對於opengl32來說這是不可能的。也許看看http://stackoverflow.com/questions/5445023/c-can-you-build-one-static-library-into-another - 雖然那裏的普遍共識似乎是鏈接與依賴關係爲好。 – jtedit