在MinGW64下编译obs-text-pango

obs-text-pango 是什么

首先介绍下OBS是什么,OBS - Free and open source software for live streaming and screen recording(OBS是一款开源的用于录屏直播的工具软件)。旧版的OBS只能支持Windows,目前已经停止开发。作者为了支持Windows/Mac/Linux重写了整个软件,项目地址为obs-studio in Github

OBS项目的语言分布:

  1. C: 57.6%
  2. C++: 36.3%
  3. Objective-C/Objective-C++: 4%
  4. others: 3%

OBS代码主要包含这些部分:

  1. libobs: 核心代码,定义项目框架以及核心API,主要用C语言编写。
  2. UI: 界面代码,采用C++的QT框架,开发出适用三大平台的界面。
  3. plugins: 插件代码,可独立编译成dll(windows平台)或so(*nix平台),包含Source(录屏输入源)、Output、Service(各种流播服务)等全部被定义为插件。
  4. libobs-d3d11: 基于D3D的图形子系统,主要用在Windows系统。
  5. libobs-opengl: 基于opengl的图形子系统,主要用在*uix系统。

obs-text-pango是obs的一个文本插件plugins,它与obs本身提供的obs-text插件不同之处在于,它支持emoji,且用pango排版引擎实现,项目地址为obs-studio in Github,forked from reboot/obs-text-pango, 这个项目源码需要改进,编译出来是无法使用

如何编译

  1. 使用MSys2的pacman工具安装以下库
1
2
3
4
5
6
7
8
pacman -S mingw-w64-x86_64-pkg-config
pacman -S mingw-w64-x86_64-gcc
pacman -S mingw64/mingw-w64-x86_64-cmake
pacman -S mingw64/mingw-w64-x86_64-make //cp mingw32-make.exe make.exe
pacman -S mingw-w64-x86_64-qt5
pacman -S mingw-w64-x86_64-ffmpeg
pacman -S mingw-w64-x86_64-vlc
pacman -S mingw-w64-x86_64-fdk-aac
  1. 下载obs-text-pango源码
1
git clone https://github.com/kkartaltepe/obs-text-pango.git
  1. 修改CMakeList.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
cmake_minimum_required(VERSION 2.8.12)

project(text-pango)

# Standalone build
if(NOT OBS_OUTPUT_DIR)
#SET(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
#SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".dll.a" ".lib" ".dll")

set(CMAKE_INSTALL_PREFIX "D:/_workdir/obs/obs-studio/vs2015/rundir/Debug")
list(APPEND CMAKE_INCLUDE_PATH "D:/_workdir/obs/obs-studio/libobs")
list(APPEND CMAKE_LIBRARY_PATH "D:/_workdir/obs/obs-studio/vs2015/libobs/Debug")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
include(ObsHelpers)

set(CMAKE_C_STANDARD 11)
set(STANDALONE_PLUGIN TRUE)

find_path(OBS_INCLUDE_DIRS
obs-module.h)
find_library(OBS_LIBRARIES
NAMES libobs obs)
# Build as submodule of obs-studio
else()
set(OBS_INCLUDE_DIRS
../../libobs)
set(OBS_LIBRARIES
libobs)
endif()

find_package(Pango REQUIRED)
find_package(Cairo REQUIRED)
find_package(Pangocairo REQUIRED)
find_package(Pangoft2 REQUIRED)
#if(WIN32)
# find_package(Pangowin32 REQUIRED)
#endif()
set(PANGOWIN32_LIBRARIES
"C:/msys64/mingw64/lib/libpangowin32-1.0.a")
find_package(Fontconfig REQUIRED)
find_package(Freetype REQUIRED)

include_directories(
${OBS_INCLUDE_DIRS}
${PANGO_INCLUDE_DIRS}
${CAIRO_INCLUDE_DIRS}
${PANGOCAIRO_INCLUDE_DIRS}
${PANGOFT2_INCLUDE_DIRS}
${FREETYPE_INCLUDE_DIRS})
if(NOT WIN32)
FIND_PACKAGE(PkgConfig)
PKG_CHECK_MODULES(GLIB glib-2.0 REQUIRED)
include_directories(${GLIB_INCLUDE_DIRS})
endif()

link_directories(
${PANGO_LIBRARY_DIRS}
${CAIRO_LIBRARY_DIRS}
${FREETYPE_LIBRARY_DIRS})

set(text-pango_SOURCES
text-pango.c
text-pango.h
text-utilities.h)

set(win32_static_LIBRARIES
intl
fribidi
pixman-1
z
harfbuzz
libpng16
expat
usp10)
if(WIN32)
set(PLATFORM_LIBRARIES ${win32_static_LIBRARIES})
endif()

add_library(text-pango MODULE
${text-pango_SOURCES})
target_link_libraries(text-pango
${OBS_LIBRARIES}
${CAIRO_LIBRARIES}
${PANGO_LIBRARIES}
${PANGOWIN32_LIBRARIES}
${PANGOCAIRO_LIBRARIES}
${PANGOFT2_LIBRARIES}
${FREETYPE_LIBRARIES}
${FONTCONFIG_LIBRARIES}
${PLATFORM_LIBRARIES}) # win only currently
target_compile_definitions(text-pango PRIVATE ${CAIRO_C_FLAGS})


if(STANDALONE_PLUGIN)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(_bit_suffix "64bit/")
else()
set(_bit_suffix "32bit/")
endif()
if(APPLE)
install(TARGETS text-pango
LIBRARY DESTINATION "Library/Application Support/obs-studio/plugins/libtext-pango/bin/")
install(DIRECTORY data/common/
DESTINATION "Library/Application Support/obs-studio/plugins/libtext-pango/data")
install(DIRECTORY data/apple/
DESTINATION "Library/Application Support/obs-studio/plugins/libtext-pango/data")
# for packaging, copy all dependencies, change dependency links
# run pkgbuild --identifier user.obsproject.kurufu.text-pango --root ./obs-text-pango-install/ text-pango-mac.pkg
else() # Not apple so normal layout
install(TARGETS text-pango
LIBRARY DESTINATION "obs-plugins/${_bit_suffix}/")
install(DIRECTORY data/common/
DESTINATION data/obs-plugins/text-pango)
# Platform specific data, like fontconfig in win32
if(WIN32)
#install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}>
# DESTINATION "obs-plugins/${_bit_suffix}/" OPTIONAL)
install(DIRECTORY data/win32/
DESTINATION data/obs-plugins/text-pango)
endif()
endif()
else()
install_obs_plugin_with_data(text-pango data/common)
# calling this twice might not work?
if(WIN32)
install_obs_plugin_with_data(text-pango data/win32)
endif()
if(APPLE)
install_obs_plugin_with_data(text-pango data/apple)
endif()
endif()
  1. 使用window的cmd工具,以x64位的姿态打开,进入obs-text-pango目录,并输入以下命令
1
2
3
4
5
mkdir mingw64
cd mingw64
cmake .. -G "MinGW Makefiles"
make
make install

过程中遇到的问题

  1. 命令行使用msys2_shell.cmd,或者git-bash.exe,会遇到一个sh冲突的问题,所以只能用windows的cmd

  2. cmake的时候使用-G “Visual Studio 14 2015 Win64”,项目能够编译过,且lib也能相互兼容,至少是c的lib,但链接的时候会有各种各样的问题,未深入去研究

  3. cmake的时候使用-G “MSYS Makefiles”,也是各种问题,可能我安装的都是mingw64的库的原因吧

  4. cmake的时候,想尽量静态编译,所以在CMakeLists.txt中加入以下语句,但在链接的时候提示各种各样奇怪问题,所以最后还是去掉

1
2
SET(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".dll.a" ".lib" ".dll")
  1. 纹理大小为0的时候,会导致程序崩溃,可能是obs新旧版本兼容问题