惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy International News Feed
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
I
InfoQ
Y
Y Combinator Blog
月光博客
月光博客
小众软件
小众软件
有赞技术团队
有赞技术团队
A
About on SuperTechFans
U
Unit 42
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
NISL@THU
NISL@THU
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
G
Google Developers Blog
V
V2EX
V
V2EX - 技术
Forbes - Security
Forbes - Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
GbyAI
GbyAI
The Cloudflare Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tailwind CSS Blog
人人都是产品经理
人人都是产品经理
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
M
MIT News - Artificial intelligence
量子位
Microsoft Security Blog
Microsoft Security Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园_首页
Recorded Future
Recorded Future
F
Full Disclosure
Hacker News - Newest:
Hacker News - Newest: "LLM"
Cyberwarzone
Cyberwarzone
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
PCI Perspectives
PCI Perspectives
H
Hacker News: Front Page
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

C

各位大佬, C 語言該怎麼練習啊 分享一个代码优化导致的死循环 人再笨还能写不出内存安全的 C? 想念 C C11 的 _Generic,现实当中用得多不多?(尤其是公司项目) 坑爹的 GBK:大家都应该去用 UTF-8 分享一个用 AI 学习 C 语言的例子 一个简单的 C 程序,但是不明白区别在哪里 我这段 C 代码可以在编译时候输出结构体的大小,你们还有什么好点子, show me the code! 这段话是否正确?「取余这个运算,只有 Python 是对的。当初 C 这个老师教错了,那么一大票学生也就只敢跟着老师错。只有 Python 敢于站出来坚持正确答案。」 C 中可变参数如何直接传递到 printf() C 的内存打印实现 函数能否实现透传不定长度参数,最终由 printf 打印 请大佬帮忙修改一份 elf 文件里的数值 Linux 上 C 的程序遇到个异常退出问题,局部变量大小有限制?? C 语言新手求助:如何在 vscode 中使用第三方库? 将资源嵌入到可执行文件中并保持目录结构 一个简单实用的 C 工程示例, 附简洁的 Makefile 关于 C 语言的相关问题 轮子更新: C/C++ 跨平台小工具库 为什么下列程序进行的是无符号乘法? 用 riscv64- Linux -gnu-gcc 编译的 c 文件为啥能在 x8664 下运行? char *s = "0123"和 char s[] = "0123"的区别 有人能完整地解释一下 int (*daytab) [13]和 int *daytab[13]吗 在 c 语言中, int a;是 declaration 还是 definition 一个简单(奇怪)的 C 语言问题 c 语言中打印指针的值打印的是 OS 分配的虚拟地址的值吗?要怎么知道 OS 给这个 c 程序进程分配的虚拟地址的大小呢? gcc 是怎么找到 system 函数的定义(实现)的? 用 C 实现轻量级表达式完成策略定制化和模板内容生成 c 语言是如何给汉字编码的? 还是不太理解 C 静态库和动态库? 开源 C 库 bfdev: MPI 大数运算 C 语言中的面向切面编程(AOP) 网络语言污染/扭曲专业术语名词——《为什么 c 语言这么抽象?》 C 语言函数资源开销可观测性 C 语言用户态函数可观测性 在 C 中,如何正确拷贝字符串 c 语言中自定义 section 段问题请教 C 语言的源码过滤功能的工具 求助 libcurl 的 curl_easy_pause() 使用方法 各位有什么深入了解 C 语言的书嘛? 不熟悉 cmake,请教一下多模块项目的 cmake 写法 大家有没有值得推荐的 c 语言的开源项目,用来学习或者贡献的。 求帮忙看一下这个 C 代码为什么会段错误! int 型返回值所能表达的内容极限 刚刚突然感受到了 C 语言指针的神奇之处 这年头搞 c 还有前途吗 看看我的 leetcode 第 151 题目 反转字符串 百变开源 C 语言库日志模块 最好用的 C 语言 JSON 解析器
开源 C 语言库 Melon 之模块选择性编译
monkeyNik · 2023-09-26 · via C

Melon是一个跨平台开源 C 语言库,提供了各类开发常用的组件。无第三方软件依赖,开箱即用,且配套中英文文档齐全。

概述

正因为 Melon 提供了非常多的组件,才有了今天这个主题——模块选择性编译。所谓的选择性编译,简单来说就是:想要用什么组件就编译什么组件,无关组件不会编译成库。

这样做有两个目的:

  1. 剔除无关内容,让使用者有选择自由度,只生成有用且精简的库文件
  2. 兼顾无操作系统开发

使用

下面我们就演示一下如何进行模块选择性编译。

第一步:获取 Melon 仓库

git clone https://github.com/Water-Melon/Melon.git

第二步:进入仓库

cd Melon

第三步:执行 configure ,我们的选择性编译也是在这一步

./configure --select=rbtree,array

这里假设我们仅编译红黑树和数组两个组件。

第四步:执行 make

make

第五步:执行 make install

make install

如果安装的位置权限不够,则需要

sudo make install

第三步中--select的参数是以逗号分隔的模块名称,注意不要有空格。

模块名称

在 Melon 官方文档中,每个组件的文档内,都给出了对应的模块名称。

还有一种简单的办法去获取模块名。在 Melon 中,几乎每个模块都有一对.c 和.h 文件。当我们需要用到某个模块,一般都是 include 那个模块的头文件。而头文件的命名一般是mln_<module>.h,这里的module部分就是模块名称(<>只是用来突出模块名称)。

实例

下面内容为笔者在虚机上执行上述命令进行选择性编译安装的终端输出内容。

$ git clone https://github.com/Water-Melon/Melon.git
Cloning into 'Melon'...
remote: Enumerating objects: 6095, done.
remote: Counting objects: 100% (1281/1281), done.
remote: Compressing objects: 100% (480/480), done.
remote: Total 6095 (delta 909), reused 1131 (delta 793), pack-reused 4814
Receiving objects: 100% (6095/6095), 3.22 MiB | 1.02 MiB/s, done.
Resolving deltas: 100% (4417/4417), done.

$ cd Melon
nik@nik:~/test/Melon$ ./configure --select=rbtree,array
Installation Path 	[/usr/local/melon]
Melang script Path 	[/usr/local/lib/melang]
Melang dylib Path 	[/usr/local/lib/melang_dynamic]
Configure done!

Melon$ make
test -d objs || mkdir objs
test -d lib || mkdir lib
cc -Iinclude -c -Wall  -Werror -O3 -fPIC -o objs/mln_rbtree.o src/mln_rbtree.c
cc -Iinclude -c -Wall  -Werror -O3 -fPIC -o objs/mln_array.o src/mln_array.c
cc -o lib/libmelon.so objs/mln_rbtree.o objs/mln_array.o   -Wall -lpthread -Llib/ -ldl -shared -fPIC
ar -r lib/libmelon.a objs/mln_rbtree.o objs/mln_array.o 
ar: creating lib/libmelon.a

Melon$ sudo make install
test -d /usr/local/lib/melang || mkdir -p /usr/local/lib/melang
test -d /usr/local/melon || mkdir -p /usr/local/melon
cp -fr lib /usr/local/melon
cp -fr include /usr/local/melon
test -d /usr/local/melon/conf || cp -fr conf /usr/local/melon
test -d /usr/local/lib/melang/trace || cp -fr trace /usr/local/lib/melang

可以看到,只有红黑树和数组的源文件被编译和打包成库了。