ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何使用项目源

2023-07-07 12:45:43  阅读:175  来源: 互联网

标签:C语言编程 源代码 Linux


在本课中,我们将构建 libgtkmm-3.0.so 库并使其成为我们的系统将要使用的库,我们还将修改 gtkmm 源代码并查看它如何影响使用该库的应用程序。

让我们从理解为什么我们需要能够使用源代码开始。我将举一个我第一份工作的例子,当时这些知识至关重要,并且会给我带来很多空闲时间。以前我正在开发 gtkmm3 应用程序来演示 3D 模型(为此我还使用了 OpenCascade)。一切都会很棒,但是 — 目标系统基于 Baikal CPU,如果不使用任何 GPU,处理 3D 就会很痛苦。我遇到过一些小部件连续闪烁的情况。这不仅仅是贝加尔湖的问题,也是gtk3本身的问题。解决方法是使用 gtkmm4,它具有不同的渲染管道,但系统没有开发包,并且必须从源代码构建库。

当然,无论您是想创建和分发自己的应用程序还是修改您使用的应用程序,使用源代码都是至关重要的。

了解构建过程的第一步是了解构建工具。现在最流行的工具有4种:cmake、make、meson、ninja。您将看到 cmake 通常与 make 一起使用,meson 与 ninja 一起使用。

开发人员使用 CMake 和 meson 编写与平台无关的构建脚本并为各种构建系统(包括 Make、Ninja、Visual Studio、Xcode 等)生成构建文件。您还可以在没有 cmake 和 meson 的情况下创建构建文件 - 它只是高级接口。CMake 指令写入 CMakeLists.txt 文件中,该文件应存储在项目根目录中。

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(FWMConfigEditor)

# 设置应用程序的目标名称
set(APP_TARGET FWMConfigEditor)

# 设置要使用的 C++ 标准
set(CMAKE_CXX_STANDARD 20)

# 定义源文件
set(SOURCE
    ./src/main.cxx
) # 使用 PkgConfig find_package(PkgConfig REQUIRED) pkg_check_modules(GTKMM REQUIRED gtkmm-3.0)

查找所需的 GTKMM包 add_definitions (${GTK_CFLAGS_OTHER}) # 为目标应用程序创建可执行文件 add_executable (${APP_TARGET} ${SOURCE }) # 链接所需的 GTKMM 库
target_link_libraries(${APP_TARGET} PRIVATE ${GTKMM_LIBRARIES})

# 包含必要的 GTKMM 目录
target_include_directories(${APP_TARGET} PRIVATE ${GTKMM_INCLUDE_DIRS})

# 链接所需的 GTKMM 库目录
target_link_directories(${APP_TARGET} PRIVATE ${GTKMM_LIBRARY_DIRS})

#添加 GTKMM 编译器选项
target_compile_options(${APP_TARGET} PRIVATE ${GTKMM_CFLAGS_OTHER})
借助cmake生成MakeFile

# CMAKE 生成的文件:请勿编辑!
# 由“Unix Makefiles”生成器生成,CMake 版本 3.16

# 当没有给 make 参数时执行的默认目标。
default_target: all

.PHONY : default_target

# 一次只允许一个“make -f Makefile2”,但传递并行性。
.NOTPARALLEL:


#================================================ =================================
# cmake 提供的特殊目标。

# 禁用隐式规则,以便规范目标正常工作。
.SUFFIXES:


# 从 gmake 中删除一些 .SUFFIXES 未删除的规则。
SUFFIXES =

.SUFFIXES: .hpux_make_needs_suffix_list


# 禁止显示已执行的命令。
$(详细).沉默:


# 一个总是过时的目标。
cmake_force:

.PHONY : cmake_force

#============================================== ====================================
# 设置构建的环境变量。

# 执行 make 规则的 shell。
SHELL = /bin/sh

# CMake 可执行文件。
CMAKE_COMMAND = /usr/bin/cmake

# 删除文件的命令。
RM = /usr/bin/cmake -E remove -f

# 对特殊字符进行转义。
EQUALS = =

# 运行 CMake 的顶级源目录。
CMAKE_SOURCE_DIR = /home/kirillzhilnikov/Utils/C++/FWMConfigEditor

# 运行 CMake 的顶级构建目录。
CMAKE_BINARY_DIR = /home/kirillzhilnikov/Utils/C++/FWMConfigEditor/build

#==================================== ============================================
# 由 CMake 全局提供的目标。

# 目标rebuild_cache的特殊规则
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
 /usr/bin/cmake -S$(CMAKE_SOURCE_DIR ) -B$(CMAKE_BINARY_DIR)
.PHONY :rebuild_cache

# 目标rebuild_cache的特殊规则
rebuild_cache/fast:rebuild_cache

.PHONY:rebuild_cache/fast

#目标edit_cache的特殊规则
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch= $(颜色)--青色“没有可用的交互式 CMake 对话框...”
 /usr/bin/cmake -E echo No\interactive\CMake\dialog\ 可用。
.PHONY : edit_cache

# 目标 edit_cache 的特殊规则
edit_cache/fast: edit_cache

.PHONY : edit_cache/fast

# 主要所有目标
all: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/kirillzhilnikov/Utils/C++/FWMConfigEditor/build/ CMakeFiles /home/kirillzhilnikov/Utils/C++/FWMConfigEditor/build/CMakeFiles/progress.marks
$(MAKE) -f CMakeFiles/Makefile2 全部
$(CMAKE_COMMAND) -E cmake_progress_start /home/kirillzhilnikov/Utils/C++/FWMConfigEditor/build/CMakeFiles 0
.PHONY : all

# 主要清理目标
clean:
$(MAKE) -f CMakeFiles/Makefile2 clean
.PHONY : clean

# 主要清理目标
clean/fast: clean

.PHONY : clean/fast

# 准备安装目标。
preinstall: all
$(MAKE) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall

# 准备安装目标。
预安装/快速:
$(MAKE) -f CMakeFiles/Makefile2 预安装
.PHONY : 预安装/快速

# 清除依赖
依赖:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/ Makefile.cmake 1
.PHONY : 依赖

#============================================ =====================================
# 名为 FWMConfigEditor 的目标的目标规则

# 为目标构建规则。
FWMConfigEditor: cmake_check_build_system
$(MAKE) -f CMakeFiles/Makefile2 FWMConfigEditor
.PHONY : FWMConfigEditor

# 目标的快速构建规则。
FWMConfigEditor/fast:
$(MAKE) -f CMakeFiles/FWMConfigEditor. dir /build.make CMakeFiles/FWMConfigEditor。dir /build
.PHONY : FWMConfigEditor/fast

src/main.o: src/main.cxx.o

.PHONY : src/main.o

# 构建目标文件的目标
src/main.cxx.o:
$(MAKE) - f CMakeFiles/FWMConfigEditor。dir /build.make CMakeFiles/FWMConfigEditor。目录/src/main.cxx.o
.PHONY : src/main.cxx.o

src/main.i: src/main.cxx.i

.PHONY : src/main.i

# 预处理源文件的目标
src/main.cxx.i:
$(MAKE) -f CMakeFiles/FWMConfigEditor。dir /build.make CMakeFiles/FWMConfigEditor。dir /src/main.cxx.i
.PHONY : src/main.cxx.i

src/main.s: src/main.cxx.s

.PHONY : src/main.s

# 为文件
src/生成程序集的目标main.cxx.s:
$(MAKE) -f CMakeFiles/FWMConfigEditor. dir /build.make CMakeFiles/FWMConfigEditor。dir /src/main.cxx.s
.PHONY : src/main.cxx.s

# 帮助目标
help :
@ echo "以下是此 Makefile 的一些有效目标:"
 @ echo  "... all(如果未提供目标,则为默认值)"
 @ echo  "... clean"
 @ echo  "... dependent"
 @ echo  " ...rebuild_cache" @echo
 " ...FWMConfigEditor" @echo " ...  edit_cache" @echo "...src/main.o" @echo "...src / main.i" @echo " .. .src/main.s" .PHONY :帮助#================================================== ============================= # make 清理操作的特殊目标。
# 运行 CMake 以检查构建系统完整性的特殊规则。
# 依赖于此的规则不能包含来自列表文件的命令
# 因为它们可能会重新生成。
cmake_check_build_system:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system
正如您现在所了解的,结果 lib 或可执行文件不是在 cmake 或 meson 的帮助下创建的,而是通过 ninja 或 make 创建的 - 构建过程本身是由所选的构建系统执行的。

让我们从源代码构建动态库 libgtk-3.so。您必须将这个特定文件的路径传递给您的 cmake 配置,以使您的 gtk4 应用程序正常工作(存储函数声明的所有 gtk3 头文件都需要存储在 libgtk-3.so 中的定义,如果您遇到问题 - 未定义的引用<函数名称> 您应该首先检查存储这些定义的文件的所有路径(让它是 libs 或 cxx 文件)。


正如您在上图中看到的,该库存储在系统上。我们将更新库并获取头文件以将它们链接到我们正在开发的应用程序中。

对于这个特定的示例,我将使用自定义 gtk 源,但这足以让您理解这个想法。


在源代码中,您可能会遇到用于生成构建文件的不同文件 - 这里有 meson.build 文件(生成 ninja 文件)和配置文件(生成 Makefile),您可以对这两个文件进行试验,看看哪一个执行成功。就我而言,ninja 有问题,所以我运行配置并获取 Makefile


然后,为了遵循 Makefile 操作,我需要运行make读取 Makefile 并执行必要操作的命令,以根据指定的规则构建项目。它使用 Makefile 中定义的指令来编译源文件、处理依赖关系并生成所需的输出。

要使用 构建 GTK make,您通常会在终端中导航到 GTK 源代码的根目录并执行命令make。这将根据 Makefile 中定义的指令启动构建过程。

运行 make 或 ninja 命令后,根据您生成的构建文件运行 (sudo make install) 或 (sudo ninja install) 至关重要。运行这些命令后,您会注意到 libgtk-3.so 的修改日期不同 - 这意味着该库已修改,并且依赖于该库的所有应用程序都将使用修改后的版本。

该make命令本身负责编译源代码并根据 Makefile 中定义的指令生成构建文件(例如目标文件、库、可执行文件等)。但是,它不会自动将这些文件安装到系统目录中。

sudo make install之后运行可make确保将构建的文件复制或安装到系统上的适当位置。该sudo命令用于以超级用户(管理)权限执行安装过程,因为某些系统目录可能需要提升权限才能写入文件。

通过运行,构建的sudo make install文件通常会安装到系统目录,例如/usr/local,,,等。这使得构建的项目(在本例中为 GTK)可以在系统范围内访问。/usr/bin/usr/lib

代码修改时间!有些人可能知道默认的 gtk 选择文件对话框不会跳转到 .desktop 文件可能指向的目录(文件对话框只是打开文件)。如果我们希望文件对话框遵循目录,该怎么办——编写补丁。

// gtk/gtkfilechooserwidget.c

// 补丁 - 如果活动文件是链接 => 跳过“switch_to_selected_folder”,硬编码关闭设置并进入文件夹
gboolean IS_FILE_LINK = FALSE;
GFile *LINK_FILE = NULL ;

// 补丁 - 将 .desktop 文件视为文件夹。如果 Type = Link => 按照 URL
  char *path_to_file = g_file_get_parse_name (file);
  GError *错误= NULL ;
  GKeyFile *key_file = g_key_file_new ();

  if ( g_str_has_suffix (path_to_file, ".desktop" ) &&
      g_key_file_load_from_file (key_file, path_to_file, G_KEY_FILE_NONE,
      !strcmp ( g_key_file_get_string (key_file, "桌面条目" , "类型" , &error), "链接" ))
  {
    char *url = g_key_file_get_string (key_file, "桌面条目" , "URL" , &error);
    LINK_FILE = g_file_test (url, G_FILE_TEST_IS_DIR) ? g_file_new_for_path (url) : NULL ;

    闭包->all_folders = 1 ;
    闭包->all_files = 0 ;

    IS_FILE_LINK = TRUE;
  }
  否则
  {
    IS_FILE_LINK = 假;
    LINK_FILE = NULL ;

    闭包->all_folders = 闭包->all_folders && is_folder;
    闭包->all_files = 闭包->all_files && !is_folder;
  g_object_unref (文件

  );
进行更改后,导航到 Makefile 所在的目录并运行(sudo make install) - 它将重新编译修改后的文件,更新 lib 并将其移动到系统文件夹。

打开任何使用 gtk3 文件对话框的应用程序,打开指向目录的 .desktop 文件并移动到该目录。




总之,使用源代码和构建系统是软件开发的一个基本方面。无论您是经验丰富的开发人员还是刚刚开始编码之旅,理解这些概念并掌握与其相关的工具对于创建健壮且高效的应用程序至关重要。

通过使用源代码,您能够检查和修改软件项目的内部工作原理。这使您可以修复错误、添加新功能或自定义软件以满足您的特定需求。源代码是整个开发过程的基础,为开发人员提供了将他们的想法变为现实所需的灵活性和控制力。

标签:C语言编程,源代码,Linux
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有