gpt4 book ai didi

c++ - 使用 cmake 包含静态库

转载 作者:行者123 更新时间:2023-11-30 03:23:19 25 4
gpt4 key购买 nike

我正在学习 C++。最令人困惑的事情之一是学习如何在使用 CMake 时链接库(我在使用 CMakeWindows 上使用 CLion)。我从 here 下载了 GLFW 的预构建二进制文件.我抓取了包含文件夹和用 mingw 构建的库文件夹。我将必要的文件放在项目的 dependencies 文件夹中。我的文件夹结构如下所示。

文件夹结构

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

代码:(从 GLFW 文档中提取的起始代码 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)

错误

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]

请告诉我哪里错了。在我的搜索中,我发现一些信息说我不应该使用旧的 cmake 函数,如 add_compiler_options、include_directories、link_directories、link_libraries。

更新的 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)

新建错误

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

引用错误

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

最佳答案

错误消息表明您没有向 target_include_directories 提供正确数量的参数功能。请引用target_include_directories的语法在documentation .

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

尖括号中的参数,如 <target>是必需的,方括号中的那些像 [BEFORE]是可选的。

在您的示例中,目标的名称是 cmake因此 include 命令应该看起来像

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

您可以阅读有关 ${PROJECT_SOURCE_DIR} 的信息.

关于c++ - 使用 cmake 包含静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50430253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com