2017-04-09 61 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

相关问题