Simon Pio.
Simon Pio.

Reputation: 135

Include external libraries into CLion project through CMake

I struggle to get GLFW Windows pre-compiled binaries working within my CLion Project. Those libraries are placed in a external directory. I do not want them to be in my project library but should (of course) be shipped when releasing the application. I am new to C++ but I thought to accomplish this might be as easy as it is in Java (Intellij Idea -> dependencies -> ...).

GLFW Windows pre-compiled binaries

I use MinGW 5.0 and CMake 3.10.2; My CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(Hatsudouki_core)

set(CMAKE_CXX_STANDARD 17)

link_directories(F:\\C++\\ExternalLibraries\\GLFW\\lib-mingw-w64)
include_directories(F:\\C++\\ExternalLibraries\\GLFW\\include)

add_executable(Hatsudouki_core main.cpp)

target_link_libraries(Hatsudouki_core glfw3)

Main.cpp

#include <iostream>
#include <GLFW/glfw3.h>

int main() {
    if (!glfwInit())
         std::cout << "error!" << std::endl;
    else
         std::cout << "success!" << std::endl;
    return 0;
}

Build output

"F:\C++\CLion 2018.1\bin\cmake\bin\cmake.exe" --build C:\Users\simon\CLionProjects\Hatsudouki-core\cmake-build-debug --target Hatsudouki_core -- -j 4
[ 50%] Linking CXX executable Hatsudouki_core.exe
CMakeFiles\Hatsudouki_core.dir/objects.a(main.cpp.obj): In function `main':
C:/Users/simon/CLionProjects/Hatsudouki-core/main.cpp:5: undefined reference to `glfwInit'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [Hatsudouki_core.exe] Error 1
CMakeFiles\Hatsudouki_core.dir\build.make:96: recipe for target 'Hatsudouki_core.exe' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/Hatsudouki_core.dir/all' failed
mingw32-make.exe[2]: *** [CMakeFiles/Hatsudouki_core.dir/all] Error 2
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/Hatsudouki_core.dir/rule' failed
mingw32-make.exe[1]: *** [CMakeFiles/Hatsudouki_core.dir/rule] Error 2
Makefile:117: recipe for target 'Hatsudouki_core' failed
mingw32-make.exe: *** [Hatsudouki_core] Error 2

I tried following solutions mentioned here:
- GLFW doc and GLFW doc2 (find package does not work, no CMake file)
- Github issue report related to Github issue report 2 which then leads to the solution to put FindGLFW.cmake into some directory? Tried to put it here GLFW\FindGLFW.cmake but does not work
- Linking did not work as well as mentioned here: Stackoverflow

Image GLFW directory: GLFW Windows pre-compiled binaries

I think I just do not understand how CMake, external Libraries and C++ work together to accomplish this fairly easy task. I believe comparison to Java would help (used to work with gradle)

EDIT 1 As suggested I added following: I put the Findglfw3.cmake into PROJECT/cmake/Modules/:

# Copyright (c) 2015 Andrew Kelley
# This file is MIT licensed.
# See http://opensource.org/licenses/MIT

# GLFW_FOUND
# GLFW_INCLUDE_DIR
# GLFW_LIBRARY

find_path(GLFW_INCLUDE_DIR NAMES F:\\C++\\ExternalLibraries\\GLFW\\include\\GLFW\\glfw3.h)

find_library(GLFW_LIBRARY NAMES glfw glfw3)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GLFW DEFAULT_MSG GLFW_LIBRARY GLFW_INCLUDE_DIR)

mark_as_advanced(GLFW_INCLUDE_DIR GLFW_LIBRARY)

And added following lines into my CMakeLists.txt:

find_package(glfw3 REQUIRED)
include_directories(${glfw3_INCLUDE_DIRS})
set(LIBS ${LIBS} ${glfw3_LIBRARIES})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

target_link_libraries(hatsudouki_core ${LIBS})

I also tried in the Findglfw3.cmake:

find_path(GLFW_INCLUDE_DIR NAMES GLFW/glfw3.h)

which is the same in the original file. Both do not work; error:

"F:\C++\CLion 2018.1\bin\cmake\bin\cmake.exe" --build C:\Users\simon\CLionProjects\Hatsudouki-core\cmake-build-debug --target Hatsudouki_core -- -j 4
CMake Error at CMakeLists.txt:6 (find_package):
-- Configuring incomplete, errors occurred!
By not providing "Findglfw3.cmake" in CMAKE_MODULE_PATH this project has
See also "C:/Users/simon/CLionProjects/Hatsudouki-core/cmake-build-debug/CMakeFiles/CMakeOutput.log".
asked CMake to find a package configuration file provided by "glfw3", but
CMake did not find one.

Makefile:175: recipe for target 'cmake_check_build_system' failed
Could not find a package configuration file provided by "glfw3" with any of
the following names:

glfw3Config.cmake
glfw3-config.cmake

Add the installation prefix of "glfw3" to CMAKE_PREFIX_PATH or set
"glfw3_DIR" to a directory containing one of the above files.  If "glfw3"
provides a separate development package or SDK, be sure it has been
installed.
mingw32-make.exe: *** [cmake_check_build_system] Error 1

Upvotes: 0

Views: 4964

Answers (2)

Simon Pio.
Simon Pio.

Reputation: 135

As explained here

  1. Make Findglfw3.cmake file in PROJECT/cmake/Modules/ which looks like

    # GLFW_FOUND
    # GLFW_INCLUDE_DIR
    # GLFW_LIBRARY
    
    set(FIND_GLFW_PATHS "F:\\C++\\ExternalLibraries\\GLFW")
    
    find_path(GLFW_INCLUDE_DIR NAMES GLFW/glfw3 GLFW/glfw3.h PATH_SUFFIXES include PATHS ${FIND_GLFW_PATHS})
    find_library(GLFW_LIBRARY NAMES glfw3 glfw3.a libglfw3 libglfw3.a PATH_SUFFIXES lib-mingw PATHS ${FIND_GLFW_PATHS})
    
    include(FindPackageHandleStandardArgs)
    find_package_handle_standard_args(GLFW DEFAULT_MSG GLFW_LIBRARY GLFW_INCLUDE_DIR)
    
    mark_as_advanced(GLFW_INCLUDE_DIR GLFW_LIBRARY)
    
  2. Define Module Path in CMakeLists.txt

    #Define module path
    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules")
    
  3. Also Link include directory and library with project in CMakeLists.txt

    #Define static GLFW libraries and header files
    find_package(glfw3 REQUIRED)
    include_directories(${GLFW_INCLUDE_DIR})
    ...
    target_link_libraries(Hatsudouki_core ${GLFW_LIBRARY})
    

Upvotes: 1

Mohit
Mohit

Reputation: 1275

At first you need to install glfw package. If you are using MSYS2 then it can be installed using pacman -S mingw-w64-x86_64-glfw on 64-bit windows and pacman -S mingw-w64-i686-glfw on 32-bit windows. And you need to use find_package to let the cmake locate the glfw library automatically instead of manually locating them. If you are not using MSYS2 then it might be little difficult. Check out this code.

cmake_minimum_required(VERSION 3.10)
project(Hatsudouki_core)

set(CMAKE_CXX_STANDARD 17)

add_executable(Hatsudouki_core main.cpp)

find_package(glfw3 REQUIRED) # Find the GLFW library
target_link_libraries(Hatsudouki_core PRIVATE glfw) # Finally, link to them.

I suggest you to use MSYS2 If you need pre-compiled libraries. It has a very good package manager called as pacman.

Upvotes: 0

Related Questions