nanogui之更新子模塊glfw3.3.2踩坑總結


nanogui源碼下載:

     A 、 https://github.com/wjakob/nanogui

     B 、 https://github.com/dalerank/nanogui

B是fork的A,但是B有新的改進。

本文僅為參考,請以實際情況為准

本文演示環境: window10 + vs2015 up3 + cmake3.18

-----------------------------------------------------------------------

折騰

 1、我想要實現界面半透明,控件不透明(透明度很差也可以)的效果。比如; 窗體時半透明的、窗體上的button, label等控件時不透明的或者透明度很差。於是想利用glfw的庫函數實現窗體半透明。這里 https://www.glfw.org/docs/3.3/group__window.html#gac31caeb3d1088831b13d2c8a156802e9)  找到了最新版glfw3.3.2中提供的庫函數glfwsetwindowopacity,原型:

void glfwSetWindowOpacity    (    GLFWwindow *     window,
float     opacity 
)    

 這個函數是在3.3版本新加入的。 

   然而,查看nanogui使用的glfw庫版本號是3.2。

  為什么這樣做? 為什么要調用庫函數設置窗體透明效果?  答案:我現在是調用的基於OS的庫函數實現的界面半透明,升級為調用glfw的庫函數方便cross-platform. 而且代碼更加簡介。 好處多多。

 

2、nanogui是引用的項目glfw_objects. 這個項目在glfw3.2中是有生成的,但是升級到3.3以后,就沒有這個項目了。

舊版3.2生成的項目一覽:

   用VS打開項目,可以清晰的看到這個項目生成的是一個靜態庫:

而新版3.3.2中生成的項目中沒有glfw_object項目:

 

3、知道了上面的區別,就不能簡單的替換nanogui下ext/glfw源碼。否則,當執行cmake指令.的時候就會出現:

Configuring done
CMake Error at CMakeLists.txt:529 (add_library):
  Error evaluating generator expression:

    $<TARGET_OBJECTS:glfw_objects>

  Objects of target "glfw_objects" referenced but no such target exists.


CMake Error at CMakeLists.txt:529 (add_library):
  Error evaluating generator expression:

    $<TARGET_OBJECTS:glfw_objects>

  Objects of target "glfw_objects" referenced but no such target exists.


CMake Error at CMakeLists.txt:529 (add_library):
  No SOURCES given to target: nanogui

  cmake提示也說的很清楚: 無法找到以用的項目【glfw_objects】,該項目不存在。

回到 nanogui頂級目錄下的 CMakeLists.txt ,找到出錯所示的行前后代碼:

if (CMAKE_GENERATOR STREQUAL Xcode)
  set(XCODE_DUMMY ${CMAKE_CURRENT_BINARY_DIR}/xcode_dummy.cpp)
  file(WRITE ${XCODE_DUMMY} "")
  add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
    ${XCODE_DUMMY}
    $<TARGET_OBJECTS:nanogui-obj>
    $<TARGET_OBJECTS:glfw_objects>
  )
else()
  if (NANOGUI_GLFW_BACKEND OR NANOGUI_VULKAN_BACKEND)
    add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
      $<TARGET_OBJECTS:nanogui-obj>
      $<TARGET_OBJECTS:glfw_objects>
    )
  else()
    add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
      $<TARGET_OBJECTS:nanogui-obj>
    )
  endif()
endif()

  我這里,將【NANOGUI_GLFW_BACKEND】設置為ON。執行上面的分支到:

add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
      $<TARGET_OBJECTS:nanogui-obj>
      $<TARGET_OBJECTS:glfw_objects>
    )

add_library將 glfw_object合並到nanogui項目。原因就是 3.3.2版本中沒有生成對應的項目,造成nanogui引用項目glfw_objects失敗,而且,在nanogui的CMakeLists,txt的前面,作者也說了,將glfw合並到nanogui。  原為如下 :

  # Two targets have now been defined: `glfw_objects`, which will be merged into
  # NanoGUI at the end, and `glfw`.  The `glfw` target is the library itself
  # (e.g., libglfw.so), but can be skipped as we do not need to link against it
  # (because we merge `glfw_objects` into NanoGUI).  Skipping is required for
  # XCode, but preferable for all build systems (reduces build artifacts).
  # --------------------------------------------------------------------------------------
  add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw" "ext_build/glfw")

 

4、個人經驗: 既然glfw是個第三方庫,如果能動態鏈接該庫肯定比nanogui目前這樣引用來的方便,庫之間保持了相對的獨立,而且維護也方便,有什么更新,只需要替換對應的頭文件和動態庫(和lib文件)即可。 個人很少做 非基於windows的開發,所以,可能上述情況不太適用其他平台。 

 

更新glfw

   1、下載nanogui源碼,我下載的是: https://github.com/dalerank/nanogui  , 要注意,一定要下載其對應的子模塊,可以使用 git 指令查看其依賴的字庫,或者  到  【這里】下載我之前就准備好的 

 2、下載glfw:    https://www.glfw.org/download.html    和   https://github.com/glfw/glfw  都可以下載到。

  還可以直接下載 已經編譯好的Windows平台的庫,我下載的是32位已經編譯好的glfw庫。

     我這里: 使用的是VS2015up3. (c++11支持更友好)

   3、解壓nanogui源碼,打開nanogui頂層目錄下的CMakeLists.txt  , 找到 523 行, 將其修改為如下:

# XCode has a serious bug where the XCode project produces an invalid target
# that will not get linked if it consists only of objects from object libraries,
# it will not generate any products (executables, libraries). The only work
# around is to add a dummy source file to the library definition. This is an
# XCode, not a CMake bug. See: https://itk.org/Bug/view.php?id=14044
if (CMAKE_GENERATOR STREQUAL Xcode)
  set(XCODE_DUMMY ${CMAKE_CURRENT_BINARY_DIR}/xcode_dummy.cpp)
  file(WRITE ${XCODE_DUMMY} "")
  add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
    ${XCODE_DUMMY}
    $<TARGET_OBJECTS:nanogui-obj>
    #$<TARGET_OBJECTS:glfw>
  )
else()
  if (NANOGUI_GLFW_BACKEND OR NANOGUI_VULKAN_BACKEND)
    ## 下面的這行是新增的,指定庫的目錄
    link_directories(${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw/lib)
    add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
      $<TARGET_OBJECTS:nanogui-obj>
      #$<TARGET_OBJECTS:glfw> ##  這里是需要你手動修改的
    )
    
    target_link_libraries(nanogui glfw3) ## 這里是新增的代碼
  else()
    add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
      $<TARGET_OBJECTS:nanogui-obj>
    )
  endif()
endif()

核心:

    ## 下面的這行是新增的,指定庫的目錄
    link_directories(${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw/lib)
    add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
      $<TARGET_OBJECTS:nanogui-obj>
      #$<TARGET_OBJECTS:glfw> ##  這里是需要你手動修改的
    )
    
    target_link_libraries(nanogui glfw3) ## 這里是新增代碼

 我將其改為了動態鏈接 glfw庫,就這樣。 

      4、將下載好的glfw的lib文件拷貝到xx/nanogui/ext/glfw/lib目錄下,上面的CMakeLists.txt中指向了在這個目錄下查找庫文件(可自定義其他路徑)

      5、CMake執行 nanogui 目錄下的 CMakeLists.txt , 生成解決方案(我這里已經打開過解決方案了):

     6、將 glfw的dll文件復制到解決方案輸出目錄,我這里是上面圖片中的debug目錄(這里的批處理文件是我自己寫的,刪除調試文 pdb, ilk 等):

 

     7、運行example,就可以看到和nanogui在GitHub上的示例圖片,我這里就放一張。(這里,example, 是大佬提前寫好的,非我自己調用glfw庫實現半透明的示例)

 

更新

    更新時間: 2020-0802 15:26

      從  https://github.com/wjakob/nanogui   fork了一份到自己的倉庫, 並做了一下更改: 

   1.刪除 nanogui 對 glfw 子模塊的引用

   2.添加glfw3.3.2源碼到項目, 

 fork 地址:  https://github.com/mohistH/nanogui

   添加更新后, 生成項目, 編譯輸出結果: 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM