使用cmake和swig扩展lua

使用cmake和swig扩展lua

swig可以用来很方便的导出C/C++代码对Lua进行扩展,但是当代码量大了之后,手动编译C/C++使用swig稍微有些困难,此时我们可以使用CMake管理工程,减少我们的工作量。

准备工作

  1. 安装lua环境。
  2. 安装swig。
  3. 安装合适的IDE,例如CLion,VS等支持CMAKE的IDE。
安装好开发环境后,我们就可以进行我们的开发工作了,这里使用简单的hello,world程序作为例子,供大家参考。
首先,我们使用IDE创建一个名为“swig_test”的CMake工程,并添加如下C++代码。

library.h

#ifndef SWIG_TEST_LIBRARY_H
#define SWIG_TEST_LIBRARY_H

void hello();

#endif //SWIG_TEST_LIBRARY_H

library.cpp

#include "library.h"

#include <iostream>

void hello()
{
	static char* str = "Hello, World!";
	std::cout << str << std::endl;
}

以上就是我们这次要导出的C++程序,这个程序会简单的输出一个Hello, World! 接下来,我们就将导出这个函数,供Lua调用。

要使用swig,不可避免的要编写.i文件,对于这个简单的HelloWorld程序,我们的.i文件内容如下

swig_test.i

%module swig_test
%include "library.h"
%{
#include "library.h"
%}

以上就是我们的代码部分的全部工作了。当然由于我们要使用CMake管理工程并使用swig所以我们对CMakeLists.txt的内容也要做些修改,CMakeLists.txt内容如下。
CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(swig_test)
FIND_PACKAGE(SWIG REQUIRED REQUIRE)
INCLUDE(${SWIG_USE_FILE})

set(CMAKE_CXX_STANDARD 17)
include_directories(/usr/local/include)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set_property(SOURCE swig_test.i PROPERTY CPLUSPLUS ON)

SWIG_ADD_LIBRARY(
       swig_test
       TYPE SHARED
       LANGUAGE lua
       SOURCES swig_test.i library.cpp)

swig_link_libraries(swig_test "/usr/local/lib/liblua.a")

值得注意的是,CMake是不区分大小写的,这个HelloWorld工程的CMakeLists.txt由于内容比较简单,是基于IDE生成的CMakeLists.txt文件修改而来的,所以有大小写混用的现象,这种做法不值得学习。

以上就是我们全部的编码工作了,接下来我们只需要点击IDE的编译按钮,就可以得到我们动态库“libswig_test.dylib”了(Windows下应该是.dll文件,Linux下应该为.so文件)

接下来,就可以编写我们的Lua代码了,笔者使用的Mac电脑,使用其它操作系统的可以对代码稍微做些修改,以满足运行要求。

lua代码如下

lua_test.lua

package.cpath = package.cpath .. ";./?.dylib"
hello = require("swig_test")
hello.hello()

然后,我们将编译生成的“libswig_test.dylib”文件修改为“swig_test.dylib”并和lua_test.lua放到同一目录下,就可以运行我们的Lua代码了,此时我们应该可以在控制台看到“Hello, World!”字样输出。

创作不易,转载请注明出处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值