简体   繁体   中英

Include static library with cmake

I am in the process of learning C++. One of the most confusing things is to learn how to link libraries when using CMake (I use CLion on Windows which uses CMake ). I downloaded the the pre-built binaries for GLFW from here . I grabbed the includes folder and the library folder built with mingw. I places the necessary files in a dependencies folder in my project. My folder structure looks like this.

Folder Structure

Project
├── bin
├── build
└── src
    ├── CMakeLists.txt
    ├── dependencies
    │   └── GLFW
    │       ├── include
    │       │   └── GLFW
    │       │       ├── glfw3.h
    │       │       └── glfw3native.h
    │       └── lib
    │           └── libglfw3.a
    ├── lib
    └── main.cpp

Code: (Starter code pulled from GLFW Documentation here )

#include <GLFW/glfw3.h>

int main(void)
{
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

CmakeList.txt

cmake_minimum_required(VERSION 3.10)
project(cmake)

set(CMAKE_CXX_STANDARD 11)
set(EXECUTABLE_OUTPUT_PATH ../bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

target_include_directories(dependencies/GLFW/include)

add_executable(cmake main.cpp)

target_link_libraries(cmake dependencies/GLFW/lib/libglfw3.a)

Error

C:\Users\username\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\181.4668.70\bin\cmake\bin\cmake.exe -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - MinGW Makefiles" C:\Users\username\CLionProjects\cmake\src
CMake Error at CMakeLists.txt:11 (target_include_directories):
  target_include_directories called with incorrect number of arguments


-- Configuring incomplete, errors occurred!
See also "C:/Users/username/CLionProjects/cmake/build/CMakeFiles/CMakeOutput.log".

[Failed to reload]

Please tell me where I am going wrong. In my search I came across some information that said I shouldn't be using older cmake functions like add_compiler_options, include_directories, link_directories, link_libraries.

Updated CMakeList.txt

cmake_minimum_required(VERSION 3.10)
project(cmake)

set(CMAKE_CXX_STANDARD 11)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

add_executable(cmake main.cpp)

target_include_directories(cmake PRIVATE dependencies/GLFW/include)
target_link_libraries(cmake ${PROJECT_SOURCE_DIR}/dependencies/GLFW/lib/libglfw3.a)

New Build Error

C:/mingw-w64/x86_64-7.2.0-posix-seh-rt_v5-rev1/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -ldependencies/GLFW/lib/libglfw3.a
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [CMakeFiles\cmake.dir\build.make:97: C:/Users/username/CLionProjects/cmake/src/bin/cmake.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:67: CMakeFiles/cmake.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:79: CMakeFiles/cmake.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:117: cmake] Error 2

Reference Error

C:\Users\username\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\181.4668.70\bin\cmake\bin\cmake.exe --build C:\Users\username\CLionProjects\cmake\Build --target cmake -- -j 8
[ 50%] Linking CXX executable C:\Users\username\CLionProjects\cmake\src\bin\cmake.exe
CMakeFiles\cmake.dir/objects.a(main.cpp.obj): In function `main':
C:/Users/username/CLionProjects/cmake/src/main.cpp:9: undefined reference to `glfwInit'
C:/Users/username/CLionProjects/cmake/src/main.cpp:13: undefined reference to `glfwCreateWindow'
C:/Users/username/CLionProjects/cmake/src/main.cpp:16: undefined reference to `glfwTerminate'
C:/Users/username/CLionProjects/cmake/src/main.cpp:21: undefined reference to `glfwMakeContextCurrent'
C:/Users/username/CLionProjects/cmake/src/main.cpp:24: undefined reference to `glfwWindowShouldClose'
C:/Users/username/CLionProjects/cmake/src/main.cpp:27: undefined reference to `__imp_glClear'
C:/Users/username/CLionProjects/cmake/src/main.cpp:30: undefined reference to `glfwSwapBuffers'
C:/Users/username/CLionProjects/cmake/src/main.cpp:33: undefined reference to `glfwPollEvents'
C:/Users/username/CLionProjects/cmake/src/main.cpp:36: undefined reference to `glfwTerminate'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [CMakeFiles\cmake.dir\build.make:98: C:/Users/username/CLionProjects/cmake/src/bin/cmake.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:67: CMakeFiles/cmake.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:79: CMakeFiles/cmake.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:117: cmake] Error 2

The error message says that you have not supplied correct number of arguments to the target_include_directories function. Please refer to the syntax of target_include_directories in the documentation .

target_include_directories(<target> [SYSTEM] [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

The arguments in angular brackets like <target> are required and the ones in square brackets like [BEFORE] are optional.

In your example the name of the target is cmake and hence the include command should look like

target_include_directories(cmake PRIVATE "${PROJECT_SOURCE_DIR}/dependencies/GLFW/include")

You can read about ${PROJECT_SOURCE_DIR} .

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