简体   繁体   中英

How To Include External Libraries in CMake Project

I am confused on how to statically include the source code of SDL2. I am trying to do this to make a library I am working on more portable.

When I was setting this up as executable the library was compiled with it fine, but when I changed it to a library it wouldn't include the library.

Currently, when I try to include my library in another project it says "Cannot open include file: 'SDL2/SDL.h': No such file or directory" . So it leads me to think that the cause of the error is that the include directories aren't exported with the static library.

My Filesystem:

include
--Header Files
src
--Source Files
extern
--SDL2
build

Here is an example of the file causing the error:

#include <iostream>
#include <SDL.h> //Error

using namespace std;

/* The code */

Here is an example of my main CMakeLists.txt:

cmake_minimum_required(VERSION 3.7)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

project(MyProject VERSION 1.0.0)

set(SDL2_SOURCE_DIR “${CMAKE_SOURCE_DIR}/extern/SDL2”)
add_subdirectory(extern/SDL2)
add_subdirectory(src)

Here is an example of my src CMakeLists.txt:

set(PROJECT_NAME MyProject)

file(GLOB HEADER_FILES "${CMAKE_SOURCE_DIR}/include/*.h")
file(GLOB SOURCES "*.cpp")

add_library(${PROJECT_NAME} ${SOURCES} ${HEADER_FILES})

target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_SOURCE_DIR}/include" PUBLIC "${CMAKE_SOURCE_DIR}/extern/SDL2/include")

target_link_libraries(${PROJECT_NAME} PRIVATE SDL2main SDL2-static)

set_target_properties( ${PROJECT_NAME}
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/lib"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin"
)

From sdl2 CMakeLists.txt try:

set(SDL_STATIC 1)
add_subdirectory(extern/SDL2) # And I recommend EXCLUDE_FROM_ALL

Also to be sure add a check:

 foreach(i IN ITEMS SDL2main SDL2-static)
    if(NOT TARGET ${i})
       message(FATAL_ERROR "${i} is not a target")
     endif()
 endif()
 target_link_libraries(${PROJECT_NAME} PRIVATE SDL2main SDL2-static)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM