一直在煩些亂七八糟的事情,繼續研究一下。
今天的目的是在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用到的工具類。
主cmake檔案include了這些子產品
這些檔案基本都在modules檔案夾下,其中obshelpers是比較重要的一個檔案,裡面提供全局變量,還有一些安裝調試的函數。
通過這個主cmake檔案,添加obs各個子產品子目錄後就能組織起整個obs工程了。
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
- 設定支援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工程的有效檔案
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檔案中添加這個子子產品就可以了。
5.通過cmake重新config跟generate,就可以打開vs調試了。
一些細節補充
1.obs的運作調試目錄其實是在rundir下的,通過install_obs_core可以把生成的exe拷貝到rundir下,但是還需要将調試指令跟調試目錄設定一下。例如下面這樣:
通過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名字就好了。