当前位置:   article > 正文

[大师C语言(第二十三篇)]C语言常用第三方库总结_c语言开发常用库

c语言开发常用库

C语言因其高效、灵活和可移植的特性,在系统编程、嵌入式开发、操作系统、网络编程等领域被广泛使用。C语言的标准库提供了一些基础功能,但在实际开发中,开发者通常需要借助第三方库来完成更加复杂的任务。本文将总结一些常用的C语言第三方库,并展示如何在C程序中使用这些库。

1. 数据库访问

SQLite

  • 简介:一个轻量级的嵌入式数据库,常用于移动应用和桌面应用中。
  • 使用:通过SQLite提供的API进行数据库操作。
  1. #include <sqlite3.h>
  2. int main() {
  3. sqlite3 *db;
  4. char *err_msg = 0;
  5. int rc = sqlite3_open("test.db", &db);
  6. if (rc != SQLITE_OK) {
  7. fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
  8. sqlite3_close(db);
  9. return 1;
  10. }
  11. sqlite3_close(db);
  12. return 0;
  13. }

2. 网络编程

libcurl

  • 简介:一个用于传输文件的客户端库,支持HTTP、HTTPS、FTP等多种协议。
  • 使用:使用libcurl提供的函数进行网络请求。
  1. #include <curl/curl.h>
  2. int main(void) {
  3. CURL *curl;
  4. CURLcode res;
  5. curl = curl_easy_init();
  6. if(curl) {
  7. curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
  8. res = curl_easy_perform(curl);
  9. if(res != CURLE_OK)
  10. fprintf(stderr, "curl_easy_perform() failed: %s\n",
  11. curl_easy_strerror(res));
  12. curl_easy_cleanup(curl);
  13. }
  14. return 0;
  15. }

3. 图形界面

GTK

  • 简介:一个跨平台的图形界面库,用于创建具有原生感的GUI应用程序。
  • 使用:使用GTK提供的函数和宏创建和管理GUI元素。
  1. #include <gtk/gtk.h>
  2. static void print_hello(GtkWidget *widget, gpointer data) {
  3. g_print("Hello World\n");
  4. }
  5. static void activate(GtkApplication *app, gpointer user_data) {
  6. GtkWidget *window;
  7. GtkWidget *button;
  8. GtkWidget *button_box;
  9. window = gtk_application_window_new(app);
  10. gtk_window_set_title(GTK_WINDOW(window), "Window");
  11. gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
  12. button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
  13. gtk_container_add(GTK_CONTAINER(window), button_box);
  14. button = gtk_button_new_with_label("Hello World");
  15. g_signal_connect(button, "clicked", G_CALLBACK(print_hello), NULL);
  16. g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);
  17. gtk_container_add(GTK_CONTAINER(button_box), button);
  18. gtk_widget_show_all(window);
  19. }
  20. int main(int argc, char *argv[]) {
  21. GtkApplication *app;
  22. int status;
  23. app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  24. g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
  25. status = g_application_run(G_APPLICATION(app), argc, argv);
  26. g_object_unref(app);
  27. return status;
  28. }

4. XML解析

libxml2

  • 简介:一个用于解析和构建XML文档的库。
  • 使用:使用libxml2提供的API进行XML解析。
  1. #include <libxml/parser.h>
  2. static void parseDoc(char *docname) {
  3. xmlDocPtr doc;
  4. xmlNodePtr cur;
  5. doc = xmlReadFile(docname, NULL, XML_PARSE_NOBLANKS);
  6. if (doc == NULL) {
  7. fprintf(stderr, "Document not parsed successfully.\n");
  8. return;
  9. }
  10. cur = xmlDocGetRootElement(doc);
  11. if (cur == NULL) {
  12. fprintf(stderr, "empty document\n");
  13. xmlFreeDoc(doc);
  14. return;
  15. }
  16. cur = cur->xmlChildrenNode;
  17. while (cur != NULL) {
  18. if ((!xmlStrcmp(cur->name, (const xmlChar *)"book"))) {
  19. xmlNodePtr child = cur->xmlChildrenNode;
  20. while (child != NULL) {
  21. if ((!xmlStrcmp(child->name, (const xmlChar *)"title"))) {
  22. xmlChar *value = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
  23. printf("title: %s\n", value);
  24. xmlFree(value);
  25. }
  26. child = child->next;
  27. }
  28. }
  29. cur = cur->next;
  30. }
  31. xmlFreeDoc(doc);
  32. }
  33. int main(int argc, char **argv) {
  34. if (argc <= 1) {
  35. printf("Usage: %s docname\n", argv[0]);
  36. return(1);
  37. }
  38. parseDoc(argv[1]);
  39. return(0);
  40. }

5. JSON处理

cJSON

  • 简介:一个轻量级的JSON解析库。
  • 使用:使用cJSON提供的API解析和生成JSON数据。
  1. #include <cjson/cJSON.h>
  2. int main() {
  3. char *json_string = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
  4. cJSON *json = cJSON_Parse(json_string);
  5. cJSON *name = cJSON_GetObjectItemCaseSensitive(json, "name");
  6. cJSON *age = cJSON_GetObjectItemCaseSensitive(json, "age");
  7. cJSON *city = cJSON_GetObjectItemCaseSensitive(json, "city");
  8. printf("Name: %s\n", name->valuestring);
  9. printf("Age: %d\n", age->valueint);
  10. printf("City: %s\n", city->valuestring);
  11. cJSON_Delete(json);
  12. return 0;
  13. }

6. 多媒体处理

FFmpeg

  • 简介:一个用于处理音频和视频的库,包括编解码、转换、流处理等功能。
  • 使用:使用FFmpeg提供的API进行多媒体处理。
  1. #include <libavcodec/avcodec.h>
  2. #include <libavformat/avformat.h>
  3. #include <libavutil/imgutils.h>
  4. int main() {
  5. const char *input_file = "input.mp4";
  6. const char *output_file = "output.yuv";
  7. AVFormatContext *input_ctx = NULL;
  8. AVCodecContext *codec_ctx = NULL;
  9. AVPacket packet;
  10. AVFrame *frame = NULL;
  11. int video_stream_index = -1;
  12. int ret;
  13. // 注册所有解码器
  14. avcodec_register_all();
  15. // 打开输入文件
  16. if (avformat_open_input(&input_ctx, input_file, NULL, NULL) < 0) {
  17. fprintf(stderr, "Could not open input file '%s'\n", input_file);
  18. return -1;
  19. }
  20. // 查找视频流
  21. for (int i = 0; i < input_ctx->nb_streams; i++) {
  22. if (input_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
  23. video_stream_index = i;
  24. break;
  25. }
  26. }
  27. if (video_stream_index == -1) {
  28. fprintf(stderr, "Could not find a video stream in the input file\n");
  29. return -1;
  30. }
  31. // 打开解码器
  32. AVCodec *codec = avcodec_find_decoder(input_ctx->streams[video_stream_index]->codecpar->codec_id);
  33. codec_ctx = avcodec_alloc_context3(codec);
  34. avcodec_parameters_to_context(codec_ctx, input_ctx->streams[video_stream_index]->codecpar);
  35. if (avcodec_open2(codec_ctx, codec, NULL) < 0) {
  36. fprintf(stderr, "Could not open codec\n");
  37. return -1;
  38. }
  39. // 读取和解码视频帧
  40. frame = av_frame_alloc();
  41. FILE *output_file_fd = fopen(output_file, "wb");
  42. while (av_read_frame(input_ctx, &packet) >= 0) {
  43. if (packet.stream_index == video_stream_index) {
  44. ret = avcodec_send_packet(codec_ctx, &packet);
  45. if (ret < 0) {
  46. fprintf(stderr, "Error sending a packet for decoding\n");
  47. break;
  48. }
  49. while (ret >= 0) {
  50. ret = avcodec_receive_frame(codec_ctx, frame);
  51. if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
  52. break;
  53. } else if (ret < 0) {
  54. fprintf(stderr, "Error during decoding\n");
  55. break;
  56. }
  57. // 将解码后的帧写入输出文件
  58. for (int i = 0; i < 3; i++) {
  59. fwrite(frame->data[i], 1, frame->linesize[i] * frame->height / (i == 0 ? 1 : 2), output_file_fd);
  60. }
  61. }
  62. }
  63. av_packet_unref(&packet);
  64. }
  65. // 清理资源
  66. fclose(output_file_fd);
  67. av_frame_free(&frame);
  68. avcodec_free_context(&codec_ctx);
  69. avformat_close_input(&input_ctx);
  70. return 0;
  71. }

7. 科学计算

GSL

  • 简介:GNU科学库(GSL)提供了一系列用于数学、物理和工程问题的函数和数据结构。
  • 使用:使用GSL提供的函数进行科学计算。
  1. #include <stdio.h>
  2. #include <gsl/gsl_sf_bessel.h>
  3. int main() {
  4. double x = 5.0;
  5. double y = gsl_sf_bessel_J0(x);
  6. printf("J0(%g) = %g\n", x, y);
  7. return 0;
  8. }

8. 加密和安全

OpenSSL

  • 简介:一个开源的加密库,提供了一系列加密和SSL/TLS功能。
  • 使用:使用OpenSSL提供的API进行加密和安全通信。
  1. #include <openssl/evp.h>
  2. int main() {
  3. EVP_CIPHER_CTX *ctx;
  4. unsigned char key[32], iv[16], in[1024], out[1024 + EVP_MAX_BLOCK_LENGTH];
  5. int len, ciphertext_len;
  6. /* 初始化密钥和IV */
  7. memset(key, 0x00, sizeof(key));
  8. memset(iv, 0x00, sizeof(iv));
  9. /* 创建并初始化加密上下文 */
  10. ctx = EVP_CIPHER_CTX_new();
  11. /* 初始化加密操作 */
  12. EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
  13. /* 提供要加密的数据 */
  14. len = strlen((char *)in);
  15. EVP_EncryptUpdate(ctx, out, &len, in, len);
  16. /* 最终化加密操作 */
  17. ciphertext_len = len;
  18. EVP_EncryptFinal_ex(ctx, out + len, &len);
  19. ciphertext_len += len;
  20. /* 清理资源 */
  21. EVP_CIPHER_CTX_free(ctx);
  22. printf("Ciphertext is %d bytes long\n", ciphertext_len);
  23. return 0;
  24. }

9. 国际化

gettext

  • 简介:一个用于国际化(i18n)和本地化(l10n)的库,用于处理不同语言的文本。
  • 使用:使用gettext提供的函数实现程序的国际化。
  1. #include <libintl.h>
  2. #include <locale.h>
  3. #define _(String) gettext (String)
  4. int main() {
  5. setlocale(LC_ALL, "");
  6. bindtextdomain("myapp", "/path/to/my/locale");
  7. textdomain("myapp");
  8. printf(_("Hello, World!\n"));
  9. return 0;
  10. }

10. 其他

Lua

  • 简介:一个轻量级的嵌入式脚本语言,可以与C语言进行交互。
  • 使用:使用Lua提供的C API嵌入Lua脚本到C程序中。
  1. #include <stdio.h>
  2. #include <lua.h>
  3. #include <lauxlib.h>
  4. #include <lualib.h>
  5. int main() {
  6. lua_State *L = luaL_newstate();
  7. luaL_openlibs(L);
  8. luaL_loadfile(L, "script.lua");
  9. lua_pcall(L, 0, 0, 0);
  10. lua_getglobal(L, "greeting");
  11. const char *greeting = lua_tostring(L, -1);
  12. printf("%s\n", greeting);
  13. lua_close(L);
  14. return 0;
  15. }

如何在自己的程序中使用第三方库

在使用第三方库时,通常需要以下几个步骤:

  1. 下载和安装库:从官方网站或代码仓库下载库的源代码,并按照提供的指南进行编译和安装。

  2. 包含头文件:在C程序中使用#include指令包含库的头文件。

  3. 链接库:在编译时,需要指定链接所需的库文件。这通常通过编译器选项(如-llibrary)来完成。

  4. 调用库函数:在程序中直接调用库提供的函数来实现所需的功能。

  5. 处理错误和异常:正确处理库函数可能返回的错误和异常情况。

  6. 资源管理:在使用库提供的资源(如内存、文件句柄等)后,确保释放这些资源以避免内存泄漏等问题。

每个库的具体使用方法可能会有所不同,因此需要参考库的官方文档来获取详细的信息和示例。

代码举例

以下是一个使用SQLite库的简单例子,展示了如何在自己的程序中使用第三方库:

  1. #include <stdio.h>
  2. #include <sqlite3.h>
  3. static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
  4. NotUsed = 0;
  5. for (int i = 0; i < argc; i++) {
  6. printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  7. }
  8. printf("\n");
  9. return 0;
  10. }
  11. int main() {
  12. sqlite3 *db;
  13. char *zErrMsg = 0;
  14. int rc;
  15. /* 打开数据库 */
  16. rc = sqlite3_open("example.db", &db);
  17. if (rc) {
  18. fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  19. sqlite3_close(db);
  20. return 1;
  21. }
  22. /* 执行SQL语句 */
  23. const char *sql = "CREATE TABLE IF NOT EXISTS COMPANY(" \
  24. "ID INT PRIMARY KEY NOT NULL," \
  25. "NAME TEXT NOT NULL," \
  26. "AGE INT NOT NULL," \
  27. "ADDRESS CHAR(50)," \
  28. "SALARY REAL);";
  29. rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
  30. if (rc != SQLITE_OK) {
  31. fprintf(stderr, "SQL error: %s\n", zErrMsg);
  32. sqlite3_free(zErrMsg);
  33. sqlite3_close(db);
  34. return 1;
  35. }
  36. /* 插入数据 */
  37. sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
  38. "VALUES (1, 'Paul', 32, 'California', 20000.00); " \
  39. "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
  40. "VALUES (2, 'Allen', 25, 'Texas', 15000.00); " \
  41. "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
  42. "VALUES (3, 'Teddy', 23, 'Norway', 20000.00); " \
  43. "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
  44. "VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00);";
  45. rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
  46. if (rc != SQLITE_OK) {
  47. fprintf(stderr, "SQL error: %s\n", zErrMsg);
  48. sqlite3_free(zErrMsg);
  49. sqlite3_close(db);
  50. return 1;
  51. }
  52. /* 查询数据 */
  53. sql = "SELECT * from COMPANY";
  54. rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
  55. if (rc != SQLITE_OK) {
  56. fprintf(stderr, "SQL error: %s\n", zErrMsg);
  57. sqlite3_free(zErrMsg);
  58. sqlite3_close(db);
  59. return 1;
  60. }
  61. /* 关闭数据库 */
  62. sqlite3_close(db);
  63. return 0;
  64. }

在这个例子中,我们首先包含了SQLite的头文件,然后定义了一个回调函数用于处理查询结果。在main函数中,我们打开了一个数据库连接,创建了一个表,插入了一些数据,并查询了这些数据。最后,我们关闭了数据库连接。

编译和运行程序

要编译和运行使用SQLite的程序,你需要确保已经安装了SQLite库,并且在编译时链接到SQLite库。以下是一个典型的编译命令:

gcc -o example example.c -lsqlite3

这将编译example.c文件并生成名为example的可执行文件。在运行程序之前,确保你的SQLite库是正确安装的,并且可执行文件有权限访问数据库文件。

总结

C语言的第三方库极大地扩展了语言的能力,允许开发者轻松地处理复杂的任务,如数据库操作、网络通信、图形界面、加密等。使用这些库可以显著提高开发效率,减少重复劳动,并促进代码的重用。在选择和使用第三方库时,应该考虑库的成熟度、社区支持、文档齐全性和兼容性。正确地使用第三方库可以极大地提升项目的质量和可靠性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/722093
推荐阅读
相关标签
  

闽ICP备14008679号