在上一篇日誌中記錄瞭如何在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;
}
說明:
- CMakeLists.txt文件與C下面的幾乎一樣,只是多了一行:add_definitions(-std=c++11)
- 注意本例是在Ubuntu下編寫的,Windows下面應該有一點不一樣,我沒有試過,很久沒有用Windows了,有興趣的朋友可以去試試。
- Lua調用動態鏈接庫時對文件路徑有限制,我沒有去探究,目前做法是把庫文件與調用文件放在同一目錄下。
LaTeX方面的調用代碼、最後效果與調用C動態鏈接庫是一樣的,這裏不再列出。本文只是列出簡單的調用方法,更深入的調用以後再記錄。