我正嘗試使用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腳本,我不會受阻。
錯誤消息中的路徑是您爲SDL2庫分配* IMPORTED_LOCATION *的路徑。如果你想鏈接你的庫和SDL2,而不是刪除SDL2,那麼將這個鏈接作爲* PRIVATE *,這樣它就不會傳播到可執行文件。 – Tsyvarev
@Tsyvarev我已經將Rendering庫中的TARGET_LINK_LIBRARIES更改爲私有鏈接SDL2,但似乎所做的只是將錯誤從Testen移至Rendering。 – UebelAndre