2017-10-10 4 views
0

は:右図書館を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: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() 

LIBSは後でGLFW_LIB変数を使用してリンクされています。

これはWindowsでうまく動作しますが、Linuxではいくつかのライブラリがありません。 glfwのWebページにはこれに対する解決策がありますが、どれもExternalProject_addの方法と互換性がないようです。

必要なライブラリがどのようになっているのか、どのように考えればいいですか?

場合、それはここに便利です構築しようとしたときに私が取得エラーです:

関連ビット:

/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 

はそれのすべて:

[ 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 
+0

外部プロジェクトをビルドした後、 '$ {CMAKE_CURRENT_BINARY_DIR}/install'ディレクトリの内容は何ですか? –

答えて

4

GLFWはCMakeのコンフィグファイルを提供しますあなたはそれを見つけるためにfind_packageを使用する必要があります。

しかし、これはExternalProject_Addは、設定時にのみ使用可能に実行していなかったされた後にいるので、あなたはスーパープロジェクトを作成し、これと同じように、あまりにもExternalProjectとして、独自のプロジェクトを追加する必要があります。set(GLFW_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/glfw_install")

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 
) 

GLFW_INSTALL_PREFIXもGLFWsで使用されていますExternalProject_Add

次に、あなたのプロジェクトに

find_package(glfw3 REQUIRED) 
find_package(OpenGL REQUIRED) 

target_link_libraries(${PROJECT_NAME} 
    glfw 
    OpenGL::GL 
) 

を使用することができます。


ExternalProjectを使用する代わりに、the GLFW suggestionに従うこともできます。

1

依存関係を処理するためにパッケージマネージャを使用している場合は、ハンターを使用してプロジェクトにGLFWを追加することを検討してください。ハンターはネイティブのCMakeで書かれており、すでに外部プロジェクトをフードの下で使用しています。しかし、イモを使う方がはるかに簡単です。

短い(疎)documentation pageがあります。基本的にはあなたの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) 

魔法HunterGateライン

は、それぞれの新しい Hunter releaseを見つけることができます...次のようになります。私は最近、あなたが迷子になった場合の手順を案内するのに役立つ codecast on Hunterを公開しました。

0

これは私がしばらく使用していた私のCMakeLists.txtの1つです。かなりシンプルにCMakeにglfw3がどこにあるのかを教えてください。そのCMakeがその仕事をしてからglfwをリンクライブラリとして追加し、それにインクルードディレクトリを与えます。これはビジュアルスタジオに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}) 
関連する問題