2017-03-26 86 views
0

我正嘗試使用CMake(3.5.2)啓動項目。對於我的項目,我想使用SDL2。這是迄今爲止的文件夾層次結構。在CMake中導入靜態第三方(SDL2)庫

PROJECT 
├── Applications 
├── External 
│   └── SDL2 
├── Games 
├── Libraries 
│ └── Rendering 
└── Tests 
    └── Testen 

我正在處理的呈現庫對SDL2有依賴性,而Testen對SDL2有依賴性。我將SDL2構建爲每個平臺的靜態庫,在我試圖將SDL2導入到CMake項目之前,我有一個處於工作狀態的基於控制檯的測試應用程序。嘗試添加它之後,我被難倒...

:-1: error: No rule to make target /**FULL_PATH_TO_PROJECT_DIR**/External/SDL2/SDL2-2.0.5/Xcode/SDL/Build/libSDL2.a, needed by `Tests/Testen/Testen.app/Contents/MacOS/Testen'. Stop. 

這裏是CMake的列表SDL2

SET (SDL2_NAME "External::SDL2") 
SET (SDL2_LIBRARY "***ABSOLUTE_PATH_TO_LIBRARY***") 
SET (SDL2_LIBRARY_DIR "***ABSOLUTE_PATH_TO_LIBRARY_DIR***") 
SET (SDL2_INCLUDE_DIR "***ABSOLUTE_PATH_TO_SDL2_INCLUDES***") 

LINK_DIRECTORIES("${SDL2_LIBRARY_DIR}") 

ADD_LIBRARY ( 
    ${SDL2_NAME} 

    STATIC 
    IMPORTED 
    GLOBAL 
) 

SET_TARGET_PROPERTIES (
    ${SDL2_NAME} 

    PROPERTIES 

    IMPORTED_LOCATION ${SDL2_LIBRARY} 
    LINK_DIRECTORIES ${SDL2_LIBRARY_DIR} 
    INTERFACE_INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR} 
) 

這裏是CMake的列表中渲染包裝庫

SET (LIBRARY_NAME Rendering) 

SET ( 
    HEADERS 

    Header1.h 
    Header2.h 
    Header3.h 
    Header4.h 
) 


SET ( 
    SOURCE 

    Source1.cpp 
    Source2.cpp 
    Source3.cpp 
    Source4.cpp 
) 


SET (
    LIB_DEPENDENCIES 

    SomeOtherLibraryWrittenByMe 
) 

LINK_DIRECTORIES("${***ABSOLUTE_PATH_TO_SDL2_LIBRARY_DIR***}") 

ADD_LIBRARY (
    ${LIBRARY_NAME} 

    ${SOURCE} 
    ${HEADERS} 
) 

ADD_DEPENDENCIES (
    ${LIBRARY_NAME} 

    ${LIB_DEPENDENCIES} 
) 

TARGET_LINK_LIBRARIES (
    ${LIBRARY_NAME} 

    ${LIB_DEPENDENCIES} 
    External::SDL2 
) 

以下是Testen的CMake清單(我的測試應用程序)

SET (APP_NAME Testen) 
SET (APP_HEADERS ***SAME_STYLE_AS_RENDERING***) 
SET (APP_SOURCE ***SAME_STYLE_AS_RENDERING***) 

LINK_DIRECTORIES("${***ABSOLUTE_PATH_TO_SDL2_LIBRARY_DIR***}") 

# Here we put together our executable 
ADD_EXECUTABLE ( 
    ${APP_NAME} 

    MACOSX_BUNDLE # Because I'm on a mac right now 

    ${APP_HEADERS} 
    ${APP_SOURCE} 
) 


ADD_DEPENDENCIES ( 
    ${APP_NAME} 

    Rendering 
) 

TARGET_LINK_LIBRARIES (
    ${APP_NAME} 

    Rendering 
) 

我的項目的目標是更多地瞭解編程的各個方面。也就是說,我正在積極避免使用像FindSDL2.cmake和其他這樣的模塊的幫手腳本。也許這可能是我需要解決我的問題的工具,但我想確切知道它在做什麼,如果我曾經嘗試添加某些項目,但沒有Find.cmake腳本,我不會受阻。

+0

錯誤消息中的路徑是您爲SDL2庫分配* IMPORTED_LOCATION *的路徑。如果你想鏈接你的庫和SDL2,而不是刪除SDL2,那麼將這個鏈接作爲* PRIVATE *,這樣它就不會傳播到可執行文件。 – Tsyvarev

+0

@Tsyvarev我已經將Rendering庫中的TARGET_LINK_LIBRARIES更改爲私有鏈接SDL2,但似乎所做的只是將錯誤從Testen移至Rendering。 – UebelAndre

回答

0

我很尷尬地說我的問題是libSDL2.a路徑中輸入錯誤的結果。儘管@Tsyvarev的確提出了一個很好的觀點,那就是我應該將SDL2作爲私有鏈接。我目前正在嘗試解決SDL2中與鏈接器錯誤相關的函數庫調用到MACOSX框架函數的錯誤。我也可能會發佈一個關於這個問題,儘管我會嘗試調試一段時間。

感謝大家對此的想法! 特別感謝@Tsyvarev :)

編輯 - 我通過將框架鏈接到我的可執行文件來解決鏈接器錯誤。一切都回到了它的原理