通过 CMake 将外部库包含到 CLion 项目中
Include external libraries into CLion project through CMake
我努力让 GLFW Windows 预编译二进制文件 在我的 CLion 项目中工作。这些库放在外部目录中。我 不希望 它们出现在我的项目库中,但(当然)应该在发布应用程序时发布。我是 C++ 的新手,但我认为完成这个可能就像在 Java 中一样容易(Intellij Idea -> dependencies -> ...)。
GLFW Windows pre-compiled binaries
我使用 MinGW 5.0 和 CMake 3.10.2;
我的 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;
}
构建输出
"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
我尝试了此处提到的以下解决方案:
- GLFW doc and GLFW doc2(查找包不起作用,没有 CMake 文件)
- 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: Whosebug
图片GLFW目录:GLFW Windows pre-compiled binaries
我想我只是不明白 CMake、外部库和 C++ 如何协同工作来完成这个相当简单的任务。我相信与 Java 进行比较会有所帮助(用于与 gradle 一起使用)
编辑 1
按照建议,我添加了以下内容:
我将 Findglfw3.cmake
放入 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)
并在我的 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})
我也试过 Findglfw3.cmake:
find_path(GLFW_INCLUDE_DIR NAMES GLFW/glfw3.h)
与原文件相同。两者都不起作用;错误:
"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
首先你需要安装glfw
包。如果您使用 MSYS2
,则可以在 64 位 windows 上使用 pacman -S mingw-w64-x86_64-glfw
并在 32 位 windows 上使用 pacman -S mingw-w64-i686-glfw
安装它。并且您需要使用 find_package
让 cmake
自动定位 glfw
库,而不是手动定位它们。如果你不使用MSYS2
那么它可能困难。查看此代码。
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.
如果你需要 pre-compiled 库,我建议你使用 MSYS2。它有一个非常好的包管理器,称为 pacman
.
正如解释的那样here
在 PROJECT/cmake/Modules/
中制作 Findglfw3.cmake
文件,看起来像
# 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)
在CMakeLists.txt
中定义模块路径
#Define module path
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules")
还 Link 在 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})
我努力让 GLFW Windows 预编译二进制文件 在我的 CLion 项目中工作。这些库放在外部目录中。我 不希望 它们出现在我的项目库中,但(当然)应该在发布应用程序时发布。我是 C++ 的新手,但我认为完成这个可能就像在 Java 中一样容易(Intellij Idea -> dependencies -> ...)。
GLFW Windows pre-compiled binaries
我使用 MinGW 5.0 和 CMake 3.10.2; 我的 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;
}
构建输出
"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
我尝试了此处提到的以下解决方案:
- GLFW doc and GLFW doc2(查找包不起作用,没有 CMake 文件)
- 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: Whosebug
图片GLFW目录:GLFW Windows pre-compiled binaries
我想我只是不明白 CMake、外部库和 C++ 如何协同工作来完成这个相当简单的任务。我相信与 Java 进行比较会有所帮助(用于与 gradle 一起使用)
编辑 1
按照建议,我添加了以下内容:
我将 Findglfw3.cmake
放入 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)
并在我的 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})
我也试过 Findglfw3.cmake:
find_path(GLFW_INCLUDE_DIR NAMES GLFW/glfw3.h)
与原文件相同。两者都不起作用;错误:
"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
首先你需要安装glfw
包。如果您使用 MSYS2
,则可以在 64 位 windows 上使用 pacman -S mingw-w64-x86_64-glfw
并在 32 位 windows 上使用 pacman -S mingw-w64-i686-glfw
安装它。并且您需要使用 find_package
让 cmake
自动定位 glfw
库,而不是手动定位它们。如果你不使用MSYS2
那么它可能困难。查看此代码。
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.
如果你需要 pre-compiled 库,我建议你使用 MSYS2。它有一个非常好的包管理器,称为 pacman
.
正如解释的那样here
在
PROJECT/cmake/Modules/
中制作Findglfw3.cmake
文件,看起来像# 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)
在
中定义模块路径CMakeLists.txt
#Define module path list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules")
还 Link 在
中包含带有项目的目录和库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})