如何在无C++运行环境下,运行大部分的C++代码(三)

前言

承接上一篇 如何在无C++运行环境下,运行大部分的C++代码(二)

 

不使用cmake编译libcxxabi

前面我们编译libcxxabi的源码时使用的是cmake工具,其中指定了使用clang和clang++来编译。这在linux主机上编译并在linux主机上运行没问题,但是往往要在无C++运行环境的平台,我们使用的是交叉编译工具,其中可能不包含完整的clang++工具,所以不能直接使用cmake工具来编译代码。

下面简单演示一下,不使用cmake编译,而是直接使用bash脚本来编译。

我们先看一下在cmake编译时加了那些参数,在cmake的CMakeLists.txt中增加-v,使其显示编译过程中不同阶段的信息。

set(CMAKE_CXX_FLAGS "-v ${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FLAGS}")

再重新编译,找到其中的编译参数信息

chenls@chenls-pc:llvm-project$ ./build_libcxxabi.sh

"/usr/lib/llvm-10/bin/clang" -cc1 
-triple x86_64-pc-linux-gnu 
-emit-obj -mrelax-all -disable-free 
-disable-llvm-verifier -discard-value-names 
-main-file-name cxa_default_handlers.cpp 
-mrelocation-model pic -pic-level 2 -mthread-model posix 
-mframe-pointer=all -fmath-errno -fno-rounding-math 
-masm-verbose -mconstructor-aliases -munwind-tables 
-target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining 
-debugger-tuning=gdb -v -nostdinc++ 
-resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 
-D HAVE___CXA_THREAD_ATEXIT_IMPL 
-D _LIBCPP_DISABLE_EXTERN_TEMPLATE 
-D _LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS 
-D _LIBCXXABI_BUILDING_LIBRARY 
-D _LIBCXXABI_HAS_NO_THREADS 
-D _LIBCXXABI_LINK_PTHREAD_LIB 
-I /home/chenls/Desktop/llvm-project/libcxxabi/include 
-I /home/chenls/Desktop/llvm-project/libcxx/include 
-D _DEBUG 
-internal-isystem /usr/local/include 
-internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include 
-internal-externc-isystem /usr/include/x86_64-linux-gnu 
-internal-externc-isystem /include 
-internal-externc-isystem /usr/include 
-Werror=return-type -W -Wall 
-Wchar-subscripts -Wconversion -Wmismatched-tags 
-Wmissing-braces -Wnewline-eof -Wunused-function 
-Wshadow -Wshorten-64-to-32 -Wsign-compare 
-Wsign-conversion -Wstrict-aliasing=2 
-Wstrict-overflow=4 -Wunused-parameter 
-Wunused-variable -Wwrite-strings -Wundef 
-Wno-error -pedantic -std=c++11 -fdeprecated-macro 
-fdebug-compilation-dir /home/chenls/Desktop/llvm-project/build-libcxxabi/src 
-ferror-limit 19 -fmessage-length 0 -fgnuc-version=4.2.1 
-fobjc-runtime=gcc -fcxx-exceptions -fexceptions 
-fdiagnostics-show-option -faddrsig 
-o CMakeFiles/cxxabi_static.dir/cxa_default_handlers.cpp.o 
-x c++ /home/chenls/Desktop/llvm-project/libcxxabi/src/cxa_default_handlers.cpp

其中的参数是clang默认带的参数加上cmake增加的参数。我们可以直接使用clang加 -v来编译test.cpp,观察默认带了那些参数。

chenls@chenls-pc:llvm-project$ clang ~/Desktop/test.cpp -v

"/usr/lib/llvm-10/bin/clang" 
-cc1 -triple x86_64-pc-linux-gnu -emit-obj 
-mrelax-all -disable-free -disable-llvm-verifier 
-discard-value-names -main-file-name test.cpp 
-mrelocation-model static -mthread-model posix 
-mframe-pointer=all -fmath-errno -fno-rounding-math 
-masm-verbose -mconstructor-aliases -munwind-tables 
-target-cpu x86-64 -dwarf-column-info 
-fno-split-dwarf-inlining -debugger-tuning=gdb 
-v -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 
-internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9 
-internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/x86_64-linux-gnu/c++/9 
-internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/x86_64-linux-gnu/c++/9 
-internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/backward 
-internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include 
-internal-externc-isystem /usr/include/x86_64-linux-gnu 
-internal-externc-isystem /include 
-internal-externc-isystem /usr/include 
-fdeprecated-macro 
-fdebug-compilation-dir /home/chenls/Desktop/llvm-project 
-ferror-limit 19 -fmessage-length 0 -fgnuc-version=4.2.1 
-fobjc-runtime=gcc -fcxx-exceptions -fexceptions 
-fdiagnostics-show-option -fcolor-diagnostics 
-faddrsig -o /tmp/test-920ed1.o 
-x c++ /home/chenls/Desktop/test.cpp

我们可以根据上下两套参数的差异(也就是从第一套参数中除去第二套参数),找出cmake编译时添加了那么参数(包括了宏定义和头文件路径等参数)。

然后我们可以写一个bash脚本,遍历libc++abi源码中所有的.cpp文件,将其编译成.o文件。(此过程省略)

再使用ar命令,将所有.o文件打包成.a文件。

ar cr libc++abi.a *.o

注意:在使用其他交叉编译工具时,编译参数需修改成对应平台的正确参数。

此时生成的libc++abi.a与前面cmake编译得到的结果一致。其中避免了使用复杂的cmake编译工具,使其在其它交叉编辑工具中,也能正常工作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值