概述
前言
承接上一篇 如何在无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编译工具,使其在其它交叉编辑工具中,也能正常工作。
最后
以上就是糟糕发夹为你收集整理的如何在无C++运行环境下,运行大部分的C++代码(三)前言不使用cmake编译libcxxabi的全部内容,希望文章能够帮你解决如何在无C++运行环境下,运行大部分的C++代码(三)前言不使用cmake编译libcxxabi所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复