2017-04-09 58 views
0

我目前正在學習CMake,我正在嘗試創建我的第一個測試項目。我可以通過CMake在Visual Studio中獲得一個簡單的項目並運行。但是,我無法添加庫。我已經閱讀了一些指南和東西,但我不斷收到錯誤。基本上,我試圖在我的示例項目中鏈接SDL庫(一個遊戲編程庫)。我已將這些庫放置在頂層「ThirdParty」文件夾中。這裏是我的CMakeLists.txt文件看起來像在我的頂層目錄:如何在我的項目中使用CMake正確鏈接我的庫?

cmake_minimum_required(VERSION 2.8.11) 

project(Hello) 

#Find necessary header files 
find_path(SDL_INCLUDE_DIR SDL.h HINTS ${CMAKE_SOURCE_DIR}/ThirdParty/SDL2/include/) 

#Find necessary library files 
find_library(SDL_LIB_DIR SDL2 HINTS ${CMAKE_SOURCE_DIR}/ThirdParty/SDL2/lib/x86) 
find_library(SDLMAIN_LIB_DIR SDLmain HINTS ${CMAKE_SOURCE_DIR}/ThirdParty/SDL2/lib/x86) 

#Add/Link files to project 
include_directories(${SDL_INCLUDE_DIR}) 
target_link_libraries(Test PUBLIC ${SDL_LIB_DIR}) 
target_link_libraries(Test PUBLIC ${SDLMAIN_LIB_DIR}) 



add_executable(Test "${CMAKE_SOURCE_DIR}/Source/Main.cpp") 

我不是100%的確定中的提示參數的,但我看到它在另一個線程使用。總之,這裏是我不斷收到錯誤:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND. 
Please set them or make sure they are set and tested correctly in the CMake files: 
SDLMAIN_LIB_DIR 
    linked by target "Test" in directory C:/Users/Jason/Desktop/Test 

什麼我做錯了,我該如何正確鏈接庫中的CMake?

+0

正如你從錯誤信息中看到的那樣,問題不在於*鏈接* SDLmain庫,而是**搜索**它是在find_library()設置NOTFOUND值時找到要求的圖書館。查看[那個問題](http://stackoverflow.com/questions/14243524/cmake-find-library-matching-behavior)關於'find_library'如何工作以及如何用它找到你的庫。 – Tsyvarev

回答

2
  1. 在cmake的,首先要創建可執行文件,並然後你把它連接到一個庫
  2. 你必須瞭解發現庫和包是如何工作的CMake。通常,它的工作方式是使用find_libraryfind_package,然後cmake將設置一些可用於鏈接到/使用庫的變量。

我不熟悉SDL,但谷歌搜索一點點吧,我會說這是應該的樣子:

find_file(SDL2_INCLUDE_DIR NAME SDL.h HINTS SDL2) 
find_library(SDL2_LIBRARY NAME SDL2) 
add_executable(MyExec main.cpp) 
target_include_directories(MyExec ${SDL2_INCLUDE_DIR}) 
target_link_libraries(MyExec ${SDL2_LIBRARY}) 

find_library將設置變量SDL2_INCLUDE_DIRSDL2_LIBRARY ,您可以使用它鏈接到SDL並將其包含添加到您的項目中。

+0

所以,如果我按照你的步驟,並取出SDLmain的target_link_libraries調用,那麼我可以讓程序工作。但是,如果我嘗試回到SDLmain中,CMake會一直告訴我它無法找到。我使用的腳本是:'find_library(SDLMAIN_LIB_DIR LIBRARY NAME SDL2main)'和this:'target_link_libraries(Test $ {SDLMAIN_LIB_DIR})'。以與其他鏈接庫相同的方式完成。我在CMake中做錯了什麼,或者它很可能是SDL的東西? – Jason

+0

@Jason我建議你首先嚐試手動鏈接到SDL庫,而不是通過CMake自動化工具(如'find_library')。一旦你成功,撤退並開始逐步使用奇特的CMake工具。 –

+0

多數民衆贊成,我有,當我做了我,我的程序都能夠圖書館。 CMake一直告訴我,找不到變量SDLMAIN_LIB_DIR。 – Jason