Vala 多用途库制作

Wesley13
• 阅读 801

库可以通过JavaScript, Python, Lua, Ruby 中的gi模块调用

valac 编译时先生成对应的C文件然后再交给gcc编译
所生成的共享库与C编译生成库一致(C convention function call)

库制作过程中涉及主要文件类型:
.so 共享库
.h   共享库描述文件(C convention)
.vapi Vala使用库描述文件
.gir 供gi 使用的库描述文件的(XML格式)
.typelib 供gi 使用的库描述文件(gtypelib格式,主要为)

调用依赖:
通过其他语言对应的gir调用 --->  typelib ---> *.so
通过vala使用 ---> *.vapi ---> *.h ---> *.so

通过C使用 ---> *.h ---> *.so

例子:
HelloObject.vala

namespace HelloObject{

public string fun() {
    return "HelloWorld";
}

}

编译步骤:
1、制作vala动态库,输出相关的.gir,.vapi以及.h
valac -X -fPIC -X -shared --library=HelloObject --gir=HelloObject-0.1.gir -H hellotestlib.h -o libHelloObject.so HelloObject.vala

-X -fPIC  编译为位置无关
-X -shared 编译为共享库
--library vala库文件输出开关,需要同时指定目标vala库的名字,即输出HelloObject.vapi
--gir GI库文件名字
-H 输出目标库的头文件
-o 指定共享库的名字

2、将对应的gir编译为typelib
g-ir-compiler --shared-library=libHelloObject.so --output=HelloObject-0.1.typelib HelloObject-0.1.gir

--shared-library 共享库的名字
--output 输出的typelib名字

Javascript调用测试
hellotest.js

var gir = require("gir");

gir.init();

var HelloObject = gir.load("HelloObject");

console.log(HelloObject.fun());

test

#!/bin/bash

export GI_TYPELIB_PATH=`pwd`
export LD_LIBRARY_PATH=`pwd`

node hellotest.js
点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Linux和Windows平台 动态库.so和.dll文件的生成
Linux动态库的生成1、纯cpp文件打包动态库将所有cpp文件和所需要的头文件放在同一文件夹,然后执行下面命令gccsharedfpic\.coxxx.so;gstdc17fpic\.cppoxxx.so;\C17标准,需要高版本gcc,本人采用gcc8.2.0\
Wesley13 Wesley13
3年前
Mysql —— linux下使用c语言访问mySql数据库
在Linux编写完c代码运行出现没有找到mysql.h是因为没有指定头文件的位置和库文件的位置。命令:gcc\I/usr/include/mysqlXXXX.c\L/usr/lib/mysqllmysqlclientoXXXXXXXX.c:你要编译的文件;XXXX:编译完的文件名;(详解:需要在gcc编译时指定头文件地
Stella981 Stella981
3年前
Linux系统的头文件和库文件搜索路径
Include的header文件,连结数据库,系统定义,总共有下列来源指定gcc去那找。当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()写在specs内的后来用DIL指定的gcc环境变量设定(编译的时候)ld.so的环境变量(这是runtime的时候)一、头文件gcc在编译时如何去
Stella981 Stella981
3年前
Python常用模块
一、什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。  但其实import加载的模块分为四个通用类别:   1使用python编写的代码(.py文件)  2已被编译为共享库或DLL的C或C扩展  3包好一组模块的包  4使用C编写并链接到
Stella981 Stella981
3年前
QT开发——动态库(.so文件)的生成与调用
1.qmake方式生成和调用动态库链接:https://blog.csdn.net/lywzgzl/article/details/428059912.cmake方式生成和调用动态库2.1创建共享库项目Cmake新建一个QtCreator项目,在C
Stella981 Stella981
3年前
Robot Framework中使用C库
Robot框架如何使用C库介绍这里通过一个简单的例子,演示如何在RobotFramework的测试库中使用C语言。我们使用Python标准库中的ctypes模块(对于早期Python版本可能未集成,需要另行安装),该模块需要调用C代码编写的共享库。当前的例子我仅在OSX上实现与测试,对于Unix和Linux平
Stella981 Stella981
3年前
Python 调用 C 库的实现
在linux开发的动态链接库需要被python调用,首先需要生成.so文件。生成动态链接库的方法网上有很多,这里就不用多说,主要就是首先根据源文件编译生成.o,然后链接这些.o文件shared生成.so。需要注意的是,在编译链接生成动态库的时候一定要加fPIC参数。而且如果在链接时需要链接其他库的话,必须保证其他库编译时也是加了fPIC参数
Stella981 Stella981
3年前
Lua学习总结
简述Lua是一个很小的编程语言,很多人将其与Python高级语言进行比较。Lua有以下的特点:(1)纯C语言实现,源码小,可以很好地与C/C融合。可自行编译,生成静态库。(2)语法简单,灵活,易学。我也同时学习了Python,相比之下,Lua精简,功能简单,可用的库少,但是语言的实现写得如此精简也很不错了!与C
Wesley13 Wesley13
3年前
JNI使用方式
作用:使Java能够同C/C动态库(dll)进行交互。编写过程:    1、native接口类,其中方法用native修饰,没有方法体。    2、通过javah命令编译native接口类,会生成.h的头文件。    3、用C编写一个dll文件        (1)需要引入刚生成的.h头文件        (2)实现头文件
Stella981 Stella981
3年前
QtCreator Lua环境配置
QtCreatorLua环境配置环境macosx10.11qt5.5lua5.3生成lua静态库下载lua源码,进行编译,生成库文件。makefile文件所在目录下使用make具体平台指令:makemacosx默认会在源码目录下生成lib