Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将正确的库作为cmake中的外部项目与GLFW链接?_C++_Cmake_Glfw - Fatal编程技术网

C++ 如何将正确的库作为cmake中的外部项目与GLFW链接?

C++ 如何将正确的库作为cmake中的外部项目与GLFW链接?,c++,cmake,glfw,C++,Cmake,Glfw,我包括glfw如下: ExternalProject_Add(glfw-external URL https://github.com/glfw/glfw/releases/download/3.2.1/glfw-3.2.1.zip PREFIX ${CMAKE_CURRENT_BINARY_DIR}/glfw INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/install CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PAT

我包括glfw如下:

ExternalProject_Add(glfw-external
  URL https://github.com/glfw/glfw/releases/download/3.2.1/glfw-3.2.1.zip
  PREFIX ${CMAKE_CURRENT_BINARY_DIR}/glfw
  INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/install
  CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)

add_dependencies(ShittyLife glfw-external)

if(UNIX)
  set(GLFW_LIB <What to put here?> libglfw3.a)
else()
  set(GLFW_LIB ${install_dir}/lib/glfw3.lib)
endif()
所有这些:

[ 94%] Building CXX object CMakeFiles/ShittyLife.dir/src/main.cpp.o
[100%] Linking CXX executable ShittyLife
/usr/bin/ld: /home/molion/Desktop/ShittyLife/build/install/lib/libglfw3.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/ShittyLife.dir/build.make:95: recipe for target 'ShittyLife' failed
make[2]: *** [ShittyLife] Error 1
CMakeFiles/Makefile2:68: recipe for target 'CMakeFiles/ShittyLife.dir/all' failed
make[1]: *** [CMakeFiles/ShittyLife.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

GLFW提供了一个CMake配置文件包,因此您应该使用
find_-package
来查找它

但是,由于这仅在运行
ExternalProject\u Add
之后才可用,而不是在配置时,因此您必须创建一个超级项目,并将自己的项目添加为ExternalProject,如下所示:

ExternalProject_Add(glfw-test
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src
    PREFIX ${CMAKE_CURRENT_BINARY_DIR}
    INSTALL_COMMAND ""
    CMAKE_CACHE_ARGS "-DCMAKE_PREFIX_PATH:STRING=${GLFW_INSTALL_PREFIX}/lib/cmake"
    DEPENDS glfw-external
)
使用
set(GLFW\u安装前缀“${CMAKE\u CURRENT\u BINARY\u DIR}/GLFW\u INSTALL”)
GLFW\u安装前缀
也用于GLFWs
ExternalProject\u Add

然后您可以使用

find_package(glfw3 REQUIRED)
find_package(OpenGL REQUIRED)

在你的项目中



除了使用
ExternalProject
之外,您还可以按照以下步骤操作

GLFW提供了一个CMake配置文件包,因此您应该使用
find_-package
来查找它

但是,由于这仅在运行
ExternalProject\u Add
之后才可用,而不是在配置时,因此您必须创建一个超级项目,并将自己的项目添加为ExternalProject,如下所示:

ExternalProject_Add(glfw-test
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src
    PREFIX ${CMAKE_CURRENT_BINARY_DIR}
    INSTALL_COMMAND ""
    CMAKE_CACHE_ARGS "-DCMAKE_PREFIX_PATH:STRING=${GLFW_INSTALL_PREFIX}/lib/cmake"
    DEPENDS glfw-external
)
使用
set(GLFW\u安装前缀“${CMAKE\u CURRENT\u BINARY\u DIR}/GLFW\u INSTALL”)
GLFW\u安装前缀
也用于GLFWs
ExternalProject\u Add

然后您可以使用

find_package(glfw3 REQUIRED)
find_package(OpenGL REQUIRED)

在你的项目中



除了使用
ExternalProject
之外,您还可以按照以下步骤操作 有一个短的(稀疏的)。基本上,您的CMakeLists.txt将如下所示

# CMake version 3.0 or higher is required for the Hunter package manager.
cmake_minimum_required(VERSION 3.0)

# Include the Hunter package manager module.
include("cmake/HunterGate.cmake")

# Ensure a reproducible build by locking down the Hunter package versions.
HunterGate(
    URL "https://github.com/ruslo/hunter/archive/v0.19.77.tar.gz"
    SHA1 "8898dd07756c408c63c63add903c8600c4cf4c0e")

# Your project name here.
project(my_project_name)

# Tell Hunter which packages to pull in for our project.
hunter_add_package(glfw)
find_package(glfw3 REQUIRED)

# Link against your target.
target_link_libraries(my_target_name glfw)

在每个新代码中都可以找到magic
HunterGate
行。我最近发表了一篇文章,如果你迷路了,它将帮助你走过这些步骤 有一个短的(稀疏的)。基本上,您的CMakeLists.txt将如下所示

# CMake version 3.0 or higher is required for the Hunter package manager.
cmake_minimum_required(VERSION 3.0)

# Include the Hunter package manager module.
include("cmake/HunterGate.cmake")

# Ensure a reproducible build by locking down the Hunter package versions.
HunterGate(
    URL "https://github.com/ruslo/hunter/archive/v0.19.77.tar.gz"
    SHA1 "8898dd07756c408c63c63add903c8600c4cf4c0e")

# Your project name here.
project(my_project_name)

# Tell Hunter which packages to pull in for our project.
hunter_add_package(glfw)
find_package(glfw3 REQUIRED)

# Link against your target.
target_link_libraries(my_target_name glfw)

在每个新代码中都可以找到magic
HunterGate
行。我最近发表了一篇文章,如果你迷路了,它将帮助你走过这些步骤

这是我使用了一段时间的
CMakeLists.txt
之一。非常简单,您可以告诉CMake
glfw3
的位置,这样它的CMake就可以完成它的工作,然后添加
glfw
作为链接库,并为它提供include目录。这与在VisualStudio中包含
GLFW
没有太大区别

cmake_minimum_required(VERSION 3.7)
project(SkyGames)

set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES main.cpp)
add_executable(SkyGames ${SOURCE_FILES})

###########################
# GLFW
###########################

set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)

add_subdirectory(${PROJECT_SOURCE_DIR}/Externals/GLFW3)

target_link_libraries(SkyGames glfw)
include_directories(SkyGames ${GLFW_INCLUDE_DIR})

###########################
# GLEW
###########################
add_definitions(-DGLEW_STATIC)
set(GLEW_ROOT_DIR ${PROJECT_SOURCE_DIR}/Externals/glew2s)
set(GLEW_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/Externals/glew2s/include)
set(GLEW_LIBRARY ${PROJECT_SOURCE_DIR}/Externals/glew2s/lib/Release/Win32/glew32s.lib)
find_package(GLEW REQUIRED)
include_directories(${GLEW_INCLUDE_DIR})

##########################
# OPENGL
##########################

find_package(OpenGL REQUIRED)
target_link_libraries(SkyGames ${GLEW_LIBRARY} ${OPENGL_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY})

这是我使用了一段时间的
CMakeLists.txt
之一。非常简单,您可以告诉CMake
glfw3
的位置,这样它的CMake就可以完成它的工作,然后添加
glfw
作为链接库,并为它提供include目录。这与在VisualStudio中包含
GLFW
没有太大区别

cmake_minimum_required(VERSION 3.7)
project(SkyGames)

set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES main.cpp)
add_executable(SkyGames ${SOURCE_FILES})

###########################
# GLFW
###########################

set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)

add_subdirectory(${PROJECT_SOURCE_DIR}/Externals/GLFW3)

target_link_libraries(SkyGames glfw)
include_directories(SkyGames ${GLFW_INCLUDE_DIR})

###########################
# GLEW
###########################
add_definitions(-DGLEW_STATIC)
set(GLEW_ROOT_DIR ${PROJECT_SOURCE_DIR}/Externals/glew2s)
set(GLEW_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/Externals/glew2s/include)
set(GLEW_LIBRARY ${PROJECT_SOURCE_DIR}/Externals/glew2s/lib/Release/Win32/glew32s.lib)
find_package(GLEW REQUIRED)
include_directories(${GLEW_INCLUDE_DIR})

##########################
# OPENGL
##########################

find_package(OpenGL REQUIRED)
target_link_libraries(SkyGames ${GLEW_LIBRARY} ${OPENGL_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY})

构建外部项目后,
${CMAKE\u CURRENT\u BINARY\u DIR}/install
目录中有什么?构建外部项目后,
${CMAKE\u CURRENT\u BINARY\u DIR}/install
目录中有什么?