C++ 通过CMake将外部库包括到CLion项目中

C++ 通过CMake将外部库包括到CLion项目中,c++,cmake,libraries,clion,glfw,C++,Cmake,Libraries,Clion,Glfw,我努力让GLFWWindows预编译二进制文件在我的CLion项目中工作。这些库被放置在外部目录中。我不希望它们出现在我的项目库中,但(当然)应该在发布应用程序时发布。我是C++的新手,但我认为要做到这一点可能和java一样容易(ITELLJ思想->依赖关系->…) 我使用mingw5.0和cmake3.10.2; My CMakeLists.txt: cmake_minimum_required(VERSION 3.10) project(Hatsudouki_core) set(CMAK

我努力让GLFWWindows预编译二进制文件在我的CLion项目中工作。这些库被放置在外部目录中。我不希望它们出现在我的项目库中,但(当然)应该在发布应用程序时发布。我是C++的新手,但我认为要做到这一点可能和java一样容易(ITELLJ思想->依赖关系->…)

我使用mingw5.0和cmake3.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)
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})
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;
}
我尝试了这里提到的以下解决方案:
-和(查找包不工作,没有CMake文件)
-然后将与之相关的解决方案放入某个目录?试图将其放在此处
GLFW\FindGLFW.cmake
,但不起作用
-链接的效果不如此处所述:

图像GLFW目录:

<>我想我不明白CMASE、外部库和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)
并在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)
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位窗口上使用
pacman-S mingw-w64-x86_64-glfw
安装,在32位窗口上使用
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.
如果您需要预编译库,我建议您使用MSYS2。如前所述,它有一个非常好的包管理器,名为
pacman

  • 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")
    
    #Define static GLFW libraries and header files
    find_package(glfw3 REQUIRED)
    include_directories(${GLFW_INCLUDE_DIR})
    ...
    target_link_libraries(Hatsudouki_core ${GLFW_LIBRARY})
    
  • CMakeLists.txt

    #Define module path
    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules")
    
    #Define static GLFW libraries and header files
    find_package(glfw3 REQUIRED)
    include_directories(${GLFW_INCLUDE_DIR})
    ...
    target_link_libraries(Hatsudouki_core ${GLFW_LIBRARY})
    

  • C++链接和java是两个非常不同的东西。试图比较它们只会让你更加困惑。您的
    CMakeLists.txt
    硬连线路径;不应该这样做。您应该将
    FindGLFW.cmake
    放在cmake可以找到它的地方(例如,通过添加将它放在
    cmake_模块_路径
    )的目录),然后使用cmake命令
    find_包(GLFW)
    。一般来说,您的问题很多,因此很难正确回答…您的CMakeLists.txt文件缺少
    find_package(glfw3)
    ,在
    target_link_库中
    调用您需要参考
    glfw
    。您可能需要将glfw3库的路径添加到
    CMAKE_模块_路径中。请参阅以了解更多信息。实际上,CMake代码似乎还可以(它并不完美,因为它使用硬编码路径而不是
    find_package()
    ,但应该可以工作)。错误“未定义对'glfwInit'的引用”表示:1。已找到GLFW头文件。2.已找到GLFW库。3.该库不包含适用于给定平台的
    glfwInit
    函数。换句话说,问题似乎是兼容性问题。@Tsyvarev那么我如何解决这个兼容性问题,或者甚至如何确定它是否是一个兼容性问题?谢谢你的回答!我不使用或没有MSYS2。因此,我尝试了评论中的其他建议。我想可能有一个解决方案,不需要安装我想要使用的每个库。如果其他建议不起作用,我会试试你的建议。