GUN C/C++ 关于利用 musl-libc 编译兼容性

我们应当在工程编译根文件之中,定义一个 MUSL 编译器分支宏来决定本次编译是否为利用 MUSL-LIBC CRT运行时编译的工程程式。

因为在通过 MUSL 编译时,我们存在一些函数上的使用限制,比如;64位扩展函数不能用,如:lseek64。

如果要展开 lseek64 函数的编译使用,我们需要打开工程预编译器宏:_LARGEFILE64_SOURCE

该宏在 GUN/LLVM C++ 之中使用 GLIBC 运行库CRT时,是默认被定义的,但在 MUSL 之中缺省是没有定义的。

CMakeLists.txt 预编译器宏定义:

cpp 复制代码
# When compiling with the musl-libc standard library, 
# You need to define the _MUSL__ preprocessor macro to ensure correct compilation.
# https://wiki.musl-libc.org/faq
# ADD_DEFINITIONS(-D__MUSL__) 

# When using the musl-libc standard library, the _LARGEFILE64_SOURCE macro is not defined by default on some platforms. 
# If 64-bit functions extended by _LARGEFILE64_SOURCE, such as lseek64, are required, it needs to be explicitly defined.
# ADD_DEFINITIONS(-D_LARGEFILE64_SOURCE)

另外在 MUSL 之中,我们需要频闭对于 GUN/C/C++ 扩展函数库:#include <execinfo.h> 的使用,所以不要指望,可以通过该函数解释C符号。

backtrace、backtrace_symbols、abi::__cxa_demangle 这些函数都是无法使用的。

但是人们仍旧期望,可以堆栈回溯,可以使用高版本 boost 实现的 stacktrace 类,boost 对于 MUSL 环境的堆栈捕获,已经做了编译自适应兼容性。

cpp 复制代码
        boost::stacktrace::stacktrace st;
        return boost::stacktrace::to_string(st);

所以,我很讨厌某些装逼人,技术不咋地,这个瞧不起、那个瞧不起,boost 库那么好用,兼容性这块没得说,除了代码量确重了点,然而并不差,但这个可以花点时间剔一下不用的代码的。

另外在 MUSL 之中,我们不能引入以下两个头文件:

这是GUN/LINUX特有的。

cpp 复制代码
#include <error.h>
#include <sys/poll.h>

#include <sys/poll.h> 是UNIX特有的。

MUSL 之中,我们需要这么引入这两个头文件,人们需要注意一下。

cpp 复制代码
#if defined(__MUSL__)
#include <err.h>
#include <poll.h>
#else
#if defined(_MACOS)
#include <errno.h>
#include <sys/poll.h>
#elif defined(_LINUX)
#include <error.h>
#include <sys/poll.h>
#endif
#endif

相关推荐
厂太_STAB_丝针1 小时前
【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
c语言·单片机·嵌入式硬件
我不是代码教父2 小时前
[原创](Modern C++)现代C++的关键性概念: 流格式化
c++·字符串格式化·流格式化·cout格式化
利刃大大3 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
charlie1145141913 小时前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
c语言·驱动开发·单片机·学习·教程·oled
子燕若水3 小时前
mac 手工安装OpenSSL 3.4.0
c++
来恩10033 小时前
C# 类与对象详解
开发语言·c#
*TQK*3 小时前
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
c语言·c++·编程知识点
komo莫莫da3 小时前
寒假刷题Day19
java·开发语言
ElseWhereR4 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法
*TQK*4 小时前
ZZNUOJ(C/C++)基础练习1031——1040(详解版)
c语言·c++·编程知识点