LaTeX备忘——通过lua调用C++动态链接库

    在上一篇日志中记录了如何在LaTeX文件中通过Lua调用C动态链接库,本文介绍如何在LaTeX中通过Lua调用C++动态链接库。

    这里我们同样要使用LuaJIT,请到LuaJIT官网下载安装。

    本示例项目的目录结构与调用C的那篇日志一样,这里不再列出,我们直接看代码


操作系统:Ubuntu 18.04

LaTeX编辑工具:TeXstudio 2.12.6

LaTeX编译方式:LuaLaTeX

构建工具:CMake 3.16.4

C++编译器:g++ 7.4.0

Lua解释器:LuaJIT 2.0.5


文件1:CMakeLists.txt

# 开源中国,陆巍
cmake_minimum_required(VERSION 3.0)

set(project_name plotpen)

# 设置库文件的生成目录为工程顶层目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})

project(${project_name})

add_definitions(-std=c++11)

aux_source_directory(src/ DIR_SRCS)

add_library(${project_name} SHARED ${DIR_SRCS})

# 去掉默认加上的lib前缀
set_target_properties(${project_name} PROPERTIES PREFIX "")

文件2:plotpen.h

// 开源中国,陆巍
#pragma once
extern "C"
{
#include "/usr/local/include/luajit-2.0/lauxlib.h"
#include "/usr/local/include/luajit-2.0/lua.h"
#include "/usr/local/include/luajit-2.0/lualib.h"
}

#include<iostream>

extern "C" int luaopen_plotpen(lua_State *L);

文件3:plotpen.cpp

// 开源中国,陆巍
#include "plotpen.h"

extern "C" void luaL_setfuncs(lua_State *L, const luaL_Reg *l, int nup);

static int Hello(lua_State *L)
{
   std::string str1 = luaL_checkstring(L, 1);
   str1 = "\\noindent\\\\" + str1 + "\\\\ We are LINUX";
   lua_pushstring(L, str1.c_str());
   return 1;
}

static const struct luaL_Reg lib[] = {
    {"Hello", Hello},
    {NULL, NULL}};

int luaopen_plotpen(lua_State *L)
{
   lua_newtable(L);
   luaL_setfuncs(L, lib, 0);
   return 1;
}

说明:

  1. CMakeLists.txt文件与C下面的几乎一样,只是多了一行:add_definitions(-std=c++11)
  2. 注意本例是在Ubuntu下编写的,Windows下面应该有一点不一样,我没有试过,很久没有用Windows了,有兴趣的朋友可以去试试。
  3. Lua调用动态链接库时对文件路径有限制,我没有去探究,目前做法是把库文件与调用文件放在同一目录下。

    LaTeX方面的调用代码、最后效果与调用C动态链接库是一样的,这里不再列出。本文只是列出简单的调用方法,更深入的调用以后再记录。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章