在上一篇日志中记录了如何在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动态链接库是一样的,这里不再列出。本文只是列出简单的调用方法,更深入的调用以后再记录。