如何在 cmake 中 link 静态库
How to link static libraries in cmake
我正尝试在我的项目中 link GLFW。有我的项目结构的截图:
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.15)
project(testo)
set(CMAKE_CXX_STANDARD 17)
add_executable(testo main.cpp)
add_library(glfw3 STATIC main.cpp)
include_directories(lib/glfw/include/)
find_library(GLFW glfw3 lib/glfw/lib)
target_link_libraries(testo LINK_PUBLIC ${GLFW})
但是,当我尝试 运行 在 clion 中进行项目时,出现错误:
====================[ Build | testo | Debug ]===================================
"C:\Program Files\JetBrains\CLion 2019.2.5\bin\cmake\win\bin\cmake.exe" --build C:\Users\Student\testo\cmake-build-debug --target testo -- -j 2
[ 50%] Linking CXX executable testo.exe
CMakeFiles\testo.dir/objects.a(main.cpp.obj): In function `main':
C:/Users/Student/testo/main.cpp:5: undefined reference to `glfwInit'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [CMakeFiles\testo.dir\build.make:87: testo.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:77: CMakeFiles/testo.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:84: CMakeFiles/testo.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:117: testo] Error 2
我认为这与 linux 添加 "lib***.a"
[pre/post]fix 到 lib 文件名有关。
尝试将您的 lib/glfw/lib
目录添加到您的 link_directories()
中,就像您对 include_dicrectories()
所做的那样。
此外,add_library()
指定您正在尝试自己编译 glfw3
,但您尝试做的只是 link。我已经为你删除了它。
cmake_minimum_required(VERSION 3.15)
project(testo)
set(CMAKE_CXX_STANDARD 17)
add_executable(testo main.cpp)
include_directories(lib/glfw/include/)
link_directories(lib/glfw/lib)
target_link_libraries(testo LINK_PUBLIC glfw3)
这是一些 github example.
这是一些 SO question you are duplicating.
基于此,这应该如下所示:
cmake_minimum_required(VERSION 3.15)
project(testo)
set(CMAKE_CXX_STANDARD 17)
find_package(GLEW REQUIRED)
add_executable(testo main.cpp)
target_link_libraries(testo PUBLIC ${GLEW_LIBRARIES})
target_include_directories(testo PUBLIC ${GLEW_INCLUDE_DIRS})
我正尝试在我的项目中 link GLFW。有我的项目结构的截图:
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.15)
project(testo)
set(CMAKE_CXX_STANDARD 17)
add_executable(testo main.cpp)
add_library(glfw3 STATIC main.cpp)
include_directories(lib/glfw/include/)
find_library(GLFW glfw3 lib/glfw/lib)
target_link_libraries(testo LINK_PUBLIC ${GLFW})
但是,当我尝试 运行 在 clion 中进行项目时,出现错误:
====================[ Build | testo | Debug ]===================================
"C:\Program Files\JetBrains\CLion 2019.2.5\bin\cmake\win\bin\cmake.exe" --build C:\Users\Student\testo\cmake-build-debug --target testo -- -j 2
[ 50%] Linking CXX executable testo.exe
CMakeFiles\testo.dir/objects.a(main.cpp.obj): In function `main':
C:/Users/Student/testo/main.cpp:5: undefined reference to `glfwInit'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [CMakeFiles\testo.dir\build.make:87: testo.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:77: CMakeFiles/testo.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:84: CMakeFiles/testo.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:117: testo] Error 2
我认为这与 linux 添加 "lib***.a"
[pre/post]fix 到 lib 文件名有关。
尝试将您的 lib/glfw/lib
目录添加到您的 link_directories()
中,就像您对 include_dicrectories()
所做的那样。
此外,add_library()
指定您正在尝试自己编译 glfw3
,但您尝试做的只是 link。我已经为你删除了它。
cmake_minimum_required(VERSION 3.15)
project(testo)
set(CMAKE_CXX_STANDARD 17)
add_executable(testo main.cpp)
include_directories(lib/glfw/include/)
link_directories(lib/glfw/lib)
target_link_libraries(testo LINK_PUBLIC glfw3)
这是一些 github example.
这是一些 SO question you are duplicating.
基于此,这应该如下所示:
cmake_minimum_required(VERSION 3.15)
project(testo)
set(CMAKE_CXX_STANDARD 17)
find_package(GLEW REQUIRED)
add_executable(testo main.cpp)
target_link_libraries(testo PUBLIC ${GLEW_LIBRARIES})
target_include_directories(testo PUBLIC ${GLEW_INCLUDE_DIRS})