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動態鏈接庫是一樣的,這裏不再列出。本文只是列出簡單的調用方法,更深入的調用以後再記錄。

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