Linux系统(Ubuntu)使用vscode进行c++开发添加三方库libxl

项目文件夹结构

├── bin
├── build

├── CMakeLists.txt
├── docs
│   ├── excel
│   └── json
├── lib
├── src

│   ├── CMakeLists.txt
│   ├── ExcelDataDeal
│   │   ├── CMakeLists.txt
│   │   ├── ExcelDataDeal.cpp
│   │   └── ExcelDataDeal.h
│   └── main.cpp
└── third_party

具体详情可见: Linux系统(Ubuntu)使用vscode进行c++开发-优快云博客

 下载编译libxl库

官方下载:https://www.libxl.com

打开Firefox进入官方地址下载tar.gz版本的压缩包

点击右边的DOWNLOAD

 在gz文件所在的文件夹中右键打开终端

因为下载的是4.5.1版本,下载下来的文件名为libxl-lin-4.5.0.tar.gz

在终端输入:

tar -xzvf libxl-lin-4.5.1.tar.gz

 解压完成之后在项目中的third_party中新建文件夹libxl以及libxl文件夹下新建include和lib文件夹,用于存放头文件和动态库(静态库)或者通过以下命令建立文件夹

mkdir libxl

cd libxl

mkdir include lib

 将解压的文件夹中的需要的内容放进include和lib文件夹中

用的c就将include_c里面的内容放进include中,用的c++就将include_cpp里面的内容放进include中

而lib里面的内容根据直接需求存放 本文采用lib64

lib32位系统(通用)存放32位架构应用的库文件
lib6464位系统(通常是x86-64架构)存放64位架构应用的库文件
lib-aarch6464位ARM架构(aarch64)存放64位ARM架构设备的库文件
lib-armhf32位ARM架构(硬件浮点)存放32位ARM硬件浮点架构设备的库文件

 至此,libxl的部分完成,接下来进入vscode中

vscode添加libxl库

配置tasks.json文件

1、在“args”中添加ExcelDataDeal文件夹中cpp文件的路径

"${workspaceFolder}/src/ExcelDataDeal/*.cpp"

 2、在“args”中添加ExcelDataDeal文件夹中h文件的路径

"-I${workspaceFolder}/src/ExcelDataDeal"

3、在“args”中链接libxl

注意第一个是大写的I  -I表示寻找include头文件  第二个-L表示寻找动态库的路径  第三个是小写的L  

"-I${workspaceFolder}/third_party/libxl/include",         #libxl的头文件路径
"-L${workspaceFolder}/third_party/libxl/lib",                #libxl的动态库路径
"-lxl",                                                                            #libxl动态库名称liblxl.so  

 综上

"args": [
                "-fdiagnostics-color=always",
                "-g",
                "${workspaceFolder}/src/*.cpp",
                "${workspaceFolder}/src/ExcelDataDeal/*.cpp",

                

                "-o",
                "${workspaceFolder}/bin/${fileBasenameNoExtension}",

                

                "-I${workspaceFolder}/src/ExcelDataDeal",

                

                // 链接libxl库
                "-I${workspaceFolder}/third_party/libxl/include",
                "-L${workspaceFolder}/third_party/libxl/lib",
                "-lxl"


            ],

配置c_cpp_properties.json文件

1、在includePath中添加

ExcelDataDeal文件夹中h文件的路径

"${workspaceFolder}/src/ExcelDataDeal"

 综上

"includePath": [
                "${workspaceFolder}/**",
                "${workspaceFolder}/src/ExcelDataDeal"
            ],

 配置settings.json文件

当完成以上两步时运行还是会提示找不到libxl.so文件

我们在终端查看一下lib路径,会发现这个路径里面没有libxl.so的路径

echo $LD_LIBRARY_PATH

 将有两个方法进行解决:

1、将libxl.so的路径添加到LD_LIBRARY_PATH中,然后写入~/.bashrc 文件中

export LD_LIBRARY_PATH=../third_party/libxl/lib:$LD_LIBRARY_PATH

source ~/.bashrc

但是这样在下次打开vscode时需要重新设置比较麻烦 ,下面介绍第二种方法,可以在打开vscode时自动生效,而且在删除该项目时也不会影响LD_LIBRARY_PATH

2、添加settings.json文件

        按f1输入Preferences: Open Workspace Settings并打开工作区特定的设置文件(JSON)

        settings.json文件就自动生成了,在settings.json文件中添加以下内容    ${workspaceFolder}表示当前根目录      

    "terminal.integrated.env.linux": 
    {
        "LD_LIBRARY_PATH": "${workspaceFolder}/third_party/libxl/lib:${LD_LIBRARY_PATH}"
    }

 vscode调试编译运行

将环境都配置好以后编写代码 注意请在docs文件夹的excel中添加一个test.xls的表

ExcelDataDeal.h
#ifndef EXCEL_DATA_DEAL_H
#define EXCEL_DATA_DEAL_H

#include<iostream>
#include<vector>
#include <string>
#include <fstream>
#include"libxl.h"

using namespace std;
using namespace libxl;

vector<vector<string>> readExcelWholeData(const char* ExcelName);

#endif // EXCEL_DATA_DEAL_H


ExcelDataDeal.cpp
#include "ExcelDataDeal.h"

vector<vector<string>> readExcelWholeData(const char* ExcelName)
{
    vector<vector<string>> Data;
    Book* book = xlCreateBook();//创建一个二进制格式的XLS的实例,在使用前必须先调用这个函数创建操作excel的对象

    book->setKey("key", "keypassword");//注册码 没有注册码只能读取300个数据
    if (book)
    {
        if (book->load(ExcelName))
        {
            Sheet* sheet = book->getSheet(0);//添加一个工作表
            if (sheet)
            {
                int colcount = sheet->lastFilledCol();//读取excel中数据的总列数
                int rowcount = sheet->lastFilledRow();//读取excel中数据的总行数
                vector<vector<string>> DataFlag(colcount,vector<string>(rowcount));
                for(int i=0;i<colcount;i++)
                {
                    DataFlag[i][0]=string(sheet->readStr(0, i));
                }
                for(int i=0;i<colcount;i++)
                {
                    for(int j=1;j<rowcount;j++)
                    {
                        CellType cellType = sheet->cellType(j, i);  //单元格的类型
                        if(cellType == CELLTYPE_STRING)// 处理字符串类型的数据
                        {
                            DataFlag[i][j]=string(sheet->readStr(j, i));
                        }
                        else if(cellType == CELLTYPE_NUMBER)// 处理数字类型的数据
                        {
                            DataFlag[i][j]=to_string(sheet->readNum(j, i));
                        }
                    }
                }
                Data=DataFlag;
            }
        }
        book->release();  // 释放资源
        
    }
    
    return Data;
}


main.cpp
#include <iostream>
#include <vector>
#include <string>
#include "ExcelDataDeal.h"

using namespace std;

int main()
{
    vector<vector<string>>data = readExcelWholeData("../docs/excel/test.xls");

    return 0;
}

因为这个Linux的注册码需要自行购买,所以此代码只限于读取300个数据

cmake编译

根据目录结构CmakeLists.txt分为三层,在其三层中分别加入以下内容:

第一层根目录的CmakeLists.txt

#变量设置   ${CMAKE_CURRENT_SOURCE_DIR}表示当前cmake所在的路径
set(ExcelDataDeal_Dir ${CMAKE_CURRENT_SOURCE_DIR}/src/ExcelDataDeal)            # ExcelDataDeal头文件路径

#三方库变量设置
set(LIBXL_Dir ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libxl/include)            # 三方库libxl头文件路径
set(LIBXL_Lib ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libxl/lib)                # 三方库libxl动态库路径

第二层main函数同路径的CmakeLists.txt

# 添加头文件
target_include_directories(${PROJECT_NAME}
    PUBLIC  #public方式
    ${ExcelDataDeal_Dir}
)

# 链接动态库
target_link_libraries(${PROJECT_NAME}
    PUBLIC  #public方式
    ExcelDataDeal
)

#添加子目录
add_subdirectory(ExcelDataDeal)

第三层ExcelDataDeal文件夹下的CmakeLists.txt

add_library(
    ${PROJECT_NAME}
    SHARED
    ExcelDataDeal.cpp
)
# 添加头文件
target_include_directories(${PROJECT_NAME}
   PUBLIC  #public方式
   ${LIBXL_Dir}
)

# 链接动态库    同下面#的两条指令,但这种能精准验证,下面链接的可能会出现找不到的情况
find_library(XL_libDir NAMES xl PATHS ${LIBXL_Dir})
if(XL_libDir)
    target_link_libraries(${PROJECT_NAME}
    PUBLIC
    ${XL_libDir})
endif()

 运行

cd build

cmake ..

make

./../bin/main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值