天天看點

obs-studio源碼閱讀筆記四

一直在煩些亂七八糟的事情,繼續研究一下。

今天的目的是在obs的項目架構下建一個自定義的qt項目helloworld。

obs工程整個是個cmake的架構,去了解了一番cmake,官網有很詳細的文檔

https://cmake.org/cmake/help/v3.13/manual/cmake-commands.7.html。

這裡建議裝vscode後再裝個cmake插件來編輯cmake檔案。

obs的cmake架構初體驗

obs除了各個項目的cmake檔案外,在cmake子目錄下有很多子產品跟cmake用到的工具類。

obs-studio源碼閱讀筆記四

主cmake檔案include了這些子產品

obs-studio源碼閱讀筆記四

這些檔案基本都在modules檔案夾下,其中obshelpers是比較重要的一個檔案,裡面提供全局變量,還有一些安裝調試的函數。

通過這個主cmake檔案,添加obs各個子產品子目錄後就能組織起整個obs工程了。

obs-studio源碼閱讀筆記四

cmake中的qt支援

上一個文章中分析過obs中qt自動生成中間檔案的原理,了解cmake後,才知道那些“自定義生成工具”其實不是手打的。原來cmake也有一套像vs的qt插件一樣的東西,可以生成這些“自定義生成工具”指令,進而協助生成像ui_OBSBasic.h這種中間檔案。

這兩個概念叫AUTOUIC 和 AUTORCC,詳細看以下:

https://cmake.org/cmake/help/v3.13/manual/cmake-qt.7.html?highlight=qt#manual:cmake-qt(7)

參照obs裡面的使用,具體是用到下面這些指令

  • 将qt目錄加入CMAKE_PREFIX_PATH
obs-studio源碼閱讀筆記四
  • 設定支援moc
set(CMAKE_AUTOMOC TRUE)
           
  • 設定生成中間檔案
qt5_wrap_ui(main_UI_HEADERS ${main_UI})
qt5_add_resources(main_QRC_SOURCES ${main_QRC})
           

自定義一個obs架構下的qt helloworld

1.首先我們去vs下使用qt的vs插件建一個helloworld工程

2.在obs主目錄下建一個自定義目錄放下剛才helloworld工程的有效檔案

obs-studio源碼閱讀筆記四

3.在上圖目錄下建一個子cmakelists.txt檔案。内容如下

project(DobaiTool)

if(MSVC AND NOT EXISTS "${CMAKE_BINARY_DIR}/dobaitool/DobaiTool.vcxproj.user")
	file(GENERATE
		OUTPUT "${CMAKE_BINARY_DIR}/dobaitool/DobaiTool.vcxproj.user"
		INPUT "${CMAKE_SOURCE_DIR}/cmake/DobaiTool.vcxproj.user.in")
endif()

set(CMAKE_INCLUDE_CURRENT_DIR TRUE)
set(CMAKE_AUTOMOC TRUE)

if(NOT Qt5Widgets_FOUND)
	if (ENABLE_UI)
		message(FATAL_ERROR "Failed to find Qt5")
	else()
		message(STATUS "Qt5 not found - UI disabled")
		return()
	endif()
endif()

include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs")


set(main_SOURCES
	QtGuiApplication1.cpp
	main.cpp)

set(main_HEADERS
	QtGuiApplication1.h)

set(main_UI
	forms/QtGuiApplication1.ui)

set(main_QRC
	forms/QtGuiApplication1.qrc)

qt5_wrap_ui(main_UI_HEADERS ${main_UI})
qt5_add_resources(main_QRC_SOURCES ${main_QRC})

add_executable(DobaiTool WIN32
	${main_SOURCES}
	${main_HEADERS}
	${main_UI_HEADERS}
	${main_QRC_SOURCES})

target_link_libraries(DobaiTool
	Qt5::Widgets)
#target_link_libraries(DobaiTool	libobs)
#define_graphic_modules(DobaiTool)

install_obs_core(DobaiTool)

           

4.最後在主cmake檔案中添加這個子子產品就可以了。

obs-studio源碼閱讀筆記四

5.通過cmake重新config跟generate,就可以打開vs調試了。

obs-studio源碼閱讀筆記四

一些細節補充

1.obs的運作調試目錄其實是在rundir下的,通過install_obs_core可以把生成的exe拷貝到rundir下,但是還需要将調試指令跟調試目錄設定一下。例如下面這樣:

obs-studio源碼閱讀筆記四

通過cmake怎麼做到呢。obs本身的ui子產品用的是自己定義vcxproj.user檔案(在cmake目錄下,我自己定義的也放那裡)。我最終也使用了這個方法,但是之前有擔心會不會被覆寫的問題,其他方案可參考:

https://stackoverflow.com/questions/1005901/how-to-set-path-environment-variable-using-cmake-and-visual-studio-to-run-test/1307784#1307784

https://stackoverflow.com/questions/46134601/cmake-set-different-debug-and-release-working-directories-in-visual-studio

附上我樣例裡面用到的這個DobaiTool.vcxproj.user.in檔案

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'">
    <LocalDebuggerCommand>$(SolutionDir)rundir\$(Configuration)\bin\64bit\DobaiTool64.exe</LocalDebuggerCommand>
    <LocalDebuggerWorkingDirectory>$(SolutionDir)rundir\$(Configuration)\bin\64bit</LocalDebuggerWorkingDirectory>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <LocalDebuggerCommand>$(SolutionDir)rundir\$(Configuration)\bin\64bit\DobaiTool64.exe</LocalDebuggerCommand>
    <LocalDebuggerWorkingDirectory>$(SolutionDir)rundir\$(Configuration)\bin\64bit</LocalDebuggerWorkingDirectory>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <LocalDebuggerCommand>$(SolutionDir)rundir\$(Configuration)\bin\64bit\DobaiTool64.exe</LocalDebuggerCommand>
    <LocalDebuggerWorkingDirectory>$(SolutionDir)rundir\$(Configuration)\bin\64bit</LocalDebuggerWorkingDirectory>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|x64'">
    <LocalDebuggerCommand>$(SolutionDir)rundir\$(Configuration)\bin\64bit\DobaiTool64.exe</LocalDebuggerCommand>
    <LocalDebuggerWorkingDirectory>$(SolutionDir)rundir\$(Configuration)\bin\64bit</LocalDebuggerWorkingDirectory>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">
    <LocalDebuggerCommand>$(SolutionDir)rundir\$(Configuration)\bin\32bit\DobaiTool.exe</LocalDebuggerCommand>
    <LocalDebuggerWorkingDirectory>$(SolutionDir)rundir\$(Configuration)\bin\32bit</LocalDebuggerWorkingDirectory>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerCommand>$(SolutionDir)rundir\$(Configuration)\bin\32bit\DobaiTool.exe</LocalDebuggerCommand>
    <LocalDebuggerWorkingDirectory>$(SolutionDir)rundir\$(Configuration)\bin\32bit</LocalDebuggerWorkingDirectory>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LocalDebuggerCommand>$(SolutionDir)rundir\$(Configuration)\bin\32bit\DobaiTool.exe</LocalDebuggerCommand>
    <LocalDebuggerWorkingDirectory>$(SolutionDir)rundir\$(Configuration)\bin\32bit</LocalDebuggerWorkingDirectory>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">
    <LocalDebuggerCommand>$(SolutionDir)rundir\$(Configuration)\bin\32bit\DobaiTool.exe</LocalDebuggerCommand>
    <LocalDebuggerWorkingDirectory>$(SolutionDir)rundir\$(Configuration)\bin\32bit</LocalDebuggerWorkingDirectory>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
</Project>
           

這樣,我就可以通過在obs解決方案裡面右鍵我的項目,單獨調試我的程式。

如果想設定成整個obs解決方案的預設調試程式,可以修改cmake下的ALL_BUILD.vcxproj.user.in檔案

将obs程式名改成自己的exe名字就好了。

obs-studio源碼閱讀筆記四

繼續閱讀