在写程序特别是集成程序的时候,经常要写代码去调用各种工具类可执行程序,在这过程中构造调用参数和执行结果判断都是比较麻烦的问题。今天我们介绍一种可以轻松解决这些问题的方法:基于LLVM的外部程序调用。
一、工程目录结构
二、示例代码
2.1 CMDemo2.cpp
1.#include
2.#include
3.#include
4.#include
5.#include
6.#include
7.
8.using namespace llvm;
9.
10.int main(int argc, char **argv){
11.
12. std::vector args;
13. args.push_back(" -ls");
14. std::string errorMsg;
15. if(sys::ExecuteAndWait("/bin/ls",args,None,{},0,0,&errorMsg)){
16. printf("Error:%s\n",errorMsg.c_str());
17. }else{
18. printf("ExecuteAndWait succeuss\n");
19. }
20. return 0;
21.}
2.2 CMakeLists.txt
1.cmake_minimum_required(VERSION 3.11.2) #cmake版本要求
2.
3.project(CMDemo2) #项目名称
4.
5.link_libraries(z)
6.link_libraries(curses)
7.link_libraries(pthread)
8.
9.set(CMAKE_CXX_STANDARD 11) #设置C++标准为C++11 LLVM 10 之后要用C++14
10.
11.set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) #设置库文件输出到代码源路径下的lib文件夹中;
12.
13.find_package(LLVM REQUIRED CONFIG) #找到LLVM库,REQUIRED表示一定要找到这个库,找不到这个库,编译就直接结束,不再往下进行了
14.
15.llvm_map_components_to_libnames(LLVM_LIBRARIES all) #获取所有的LLVM库名称列表 保存在LLVM_LIBRARIES变量中
16.include_directories(${LLVM_INCLUDE_DIRS}) #设置LLVM库的头文件路径
17.
18.add_compile_options(-fno-rtti) #不用C++ RTTI 不然链接的时候会报错
19.
20.include_directories(${PROJECT_SOURCE_DIR}/include) #设置工程头文件路径
21.
22.
23.add_executable(CMDemo2 src/CMDemo2.cpp)
24.
25.target_link_libraries(CMDemo2 ${LLVM_LIBRARIES}) #添加依赖库
26.
三、运行效果
四、总结
通过利用LLVM库中提供的功能、方便的解决了我们的问题。不用什么都自己从造轮子开始,站在巨人的肩膀上可以让我们走得更快、飞得更高!