基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用)

目录

  • 基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用)

    • 背景
    • 下载地址
    • 仓库地址
    • 安装部署 msys2
      • 安装
      • 配置环境变量
    • 安装cmake:
    • 下载 TDengine
    • 修改说明
      • CMakeLists.txt
      • src/client/CMakeLists.txt
      • deps/iconv/iconv.c
      • os/windows/inc/os.h
      • src/os/windows/src/twindows.c
      • src/inc/taos.h
    • cmake 转换
    • make
    • cgo 使用
    • 运行时

基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用)

背景

TDengine 提供的 go 连接器使用的是 cgo 且只能在 liunx 系统下使用,windows上的动态库是由vc编译器编译而成,cgo 无法使用,本文提供 windows 下用 gcc 编译器编译 TDengine 的步骤和本人编译后的成品。
重中之重!交叉编译后的动态库并不保证质量!生产环境 慎用!慎用!慎用!生产环境使用官方提供的 taos.dll** 改名为 libtaos.dll 使用**

下载地址

不想看编译步骤只想 下载使用 请点这里跳转到 github 下载 release

仓库地址

github 仓库地址

安装部署 msys2

安装

https://mirror.tuna.tsinghua.edu.cn/help/msys2/
安装完后打开 c:\msys64\msys2_shell.cmd 在窗口上右击, 选择 Options ,更改字符集 zh_cn gbk
修改 pacman 配置见上面网页 (有梯子可以省略这步)
修改后执行

pacman -S mingw-w64-x86_64-gcc

配置环境变量

C:\msys64\mingw64\bin
C:\msys64\usr\bin

按以上顺序添加到系统变量 path

安装cmake:

https://cmake.org/download/
默认安装

下载 TDengine

https://github.com/taosdata/TDengine/archive/ver-1.6.4.4.zip

修改说明

CMakeLists.txt

注释或删除以下行:

    SET(COMMON_FLAGS "/nologo /WX- /Oi /Oy- /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Gd /errorReport:prompt /analyze-")
    SET(DEBUG_FLAGS "/Zi /W3 /GL")
    SET(RELEASE_FLAGS "/W0 /GL")

src/client/CMakeLists.txt

注释或删除以下行:

SET_TARGET_PROPERTIES(taos PROPERTIES LINK_FLAGS /DEF:${TD_COMMUNITY_DIR}/src/client/src/taos.def)

deps/iconv/iconv.c

修改以下行

const struct alias *
aliases2_lookup (register const char *str)
{
  const struct alias * ptr;
  unsigned int count;
  for (ptr = sysdep_aliases, count = sizeof(sysdep_aliases)/sizeof(sysdep_aliases[0]); count > 0; ptr++, count--)
    if (!strcmp(str, stringpool2 + ptr->name))
      return ptr;
  return NULL;
}

改为

// gcc -o0 bug fix
// see http://git.savannah.gnu.org/gitweb/?p=libiconv.git;a=blobdiff;f=lib/iconv.c;h=31853a7f1c47871221189dbf597473a16d8a8da7;hp=5a1a32597fa3efc5f69624d37a2eb96f308cd241;hb=b29089d8b43abc8fba073da7e6dccaeba56b2b70;hpb=0a04404c90d6a725b8b6bbcd65e10c5fcf5993e9

static const struct alias *
aliases2_lookup (register const char *str)
{
  const struct alias * ptr;
  unsigned int count;
  for (ptr = sysdep_aliases, count = sizeof(sysdep_aliases)/sizeof(sysdep_aliases[0]); count > 0; ptr++, count--)
    if (!strcmp(str, stringpool2 + ptr->name))
      return ptr;
  return NULL;
}

os/windows/inc/os.h

添加头文件

#include <WS2tcpip.h>
#include <winbase.h>

修改1:

// #define str2int64 _atoi64
int64_t str2int64(char *str);

修改2:

// #define atomic_val_compare_exchange_8(ptr, oldval, newval) _InterlockedCompareExchange8((char volatile*)(ptr), (char)(newval), (char)(oldval))
#define atomic_val_compare_exchange_8 __sync_val_compare_and_swap

修改3:

// #define atomic_fetch_add_8(ptr, val) _InterlockedExchangeAdd8((char volatile*)(ptr), (char)(val))
// #define atomic_fetch_add_16(ptr, val) _InterlockedExchangeAdd16((short volatile*)(ptr), (short)(val))
#define atomic_fetch_add_8 __sync_fetch_and_ad
#define atomic_fetch_add_16 __sync_fetch_and_add

修改4:

// char interlocked_and_fetch_8(char volatile* ptr, char val);
// short interlocked_and_fetch_16(short volatile* ptr, short val);
long interlocked_and_fetch_32(long volatile* ptr, long val);
__int64 interlocked_and_fetch_64(__int64 volatile* ptr, __int64 val);

// #define atomic_and_fetch_8(ptr, val) interlocked_and_fetch_8((char volatile*)(ptr), (char)(val))
// #define atomic_and_fetch_16(ptr, val) interlocked_and_fetch_16((short volatile*)(ptr), (short)(val))
#define atomic_and_fetch_32(ptr, val) interlocked_and_fetch_32((long volatile*)(ptr), (long)(val))
#define atomic_and_fetch_64(ptr, val) interlocked_and_fetch_64((__int64 volatile*)(ptr), (__int64)(val))

修改5:

// #define atomic_fetch_and_8(ptr, val) _InterlockedAnd8((char volatile*)(ptr), (char)(val))
// #define atomic_fetch_and_16(ptr, val) _InterlockedAnd16((short volatile*)(ptr), (short)(val))
#define atomic_fetch_and_32(ptr, val) _InterlockedAnd((long volatile*)(ptr), (long)(val))

修改6:

// char interlocked_or_fetch_8(char volatile* ptr, char val);
// short interlocked_or_fetch_16(short volatile* ptr, short val);
long interlocked_or_fetch_32(long volatile* ptr, long val);
__int64 interlocked_or_fetch_64(__int64 volatile* ptr, __int64 val);

// #define atomic_or_fetch_8(ptr, val) interlocked_or_fetch_8((char volatile*)(ptr), (char)(val))
// #define atomic_or_fetch_16(ptr, val) interlocked_or_fetch_16((short volatile*)(ptr), (short)(val))
#define atomic_or_fetch_32(ptr, val) interlocked_or_fetch_32((long volatile*)(ptr), (long)(val))
#define atomic_or_fetch_64(ptr, val) interlocked_or_fetch_64((__int64 volatile*)(ptr), (__int64)(val))

修改7:

// #define atomic_fetch_or_8(ptr, val) _InterlockedOr8((char volatile*)(ptr), (char)(val))
// #define atomic_fetch_or_16(ptr, val) _InterlockedOr16((short volatile*)(ptr), (short)(val))
#define atomic_fetch_or_32(ptr, val) _InterlockedOr((long volatile*)(ptr), (long)(val))

修改8:

// char interlocked_xor_fetch_8(char volatile* ptr, char val);
// short interlocked_xor_fetch_16(short volatile* ptr, short val);
long interlocked_xor_fetch_32(long volatile* ptr, long val);
__int64 interlocked_xor_fetch_64(__int64 volatile* ptr, __int64 val);

// #define atomic_xor_fetch_8(ptr, val) interlocked_xor_fetch_8((char volatile*)(ptr), (char)(val))
// #define atomic_xor_fetch_16(ptr, val) interlocked_xor_fetch_16((short volatile*)(ptr), (short)(val))
#define atomic_xor_fetch_32(ptr, val) interlocked_xor_fetch_32((long volatile*)(ptr), (long)(val))
#define atomic_xor_fetch_64(ptr, val) interlocked_xor_fetch_64((__int64 volatile*)(ptr), (__int64)(val))

修改9:

// #define atomic_fetch_xor_8(ptr, val) _InterlockedXor8((char volatile*)(ptr), (char)(val))
// #define atomic_fetch_xor_16(ptr, val) _InterlockedXor16((short volatile*)(ptr), (short)(val))
#define atomic_fetch_xor_32(ptr, val) _InterlockedXor((long volatile*)(ptr), (long)(val))

修改10:

// #define MILLISECOND_PER_SECOND (1000i64)
#define MILLISECOND_PER_SECOND (1000LL)

src/os/windows/src/twindows.c

添加头:

#include <intrin.h>
#include <winbase.h>
#include <Winsock2.h>

修改1:

// add
// char interlocked_add_fetch_8(char volatile* ptr, char val) {
//   return _InterlockedExchangeAdd8(ptr, val) + val;
// }

// short interlocked_add_fetch_16(short volatile* ptr, short val) {
//   return _InterlockedExchangeAdd16(ptr, val) + val;
// }

char interlocked_add_fetch_8(char volatile* ptr, char val) {
  return __sync_fetch_and_add(ptr, val) + val;
}

short interlocked_add_fetch_16(short volatile* ptr, short val) {
  return __sync_fetch_and_add(ptr, val) + val;
}

修改2:

// and
// char interlocked_and_fetch_8(char volatile* ptr, char val) {
//   return _InterlockedAnd8(ptr, val) & val;
// }

// short interlocked_and_fetch_16(short volatile* ptr, short val) {
//   return _InterlockedAnd16(ptr, val) & val;
// }

修改3:

// or
// char interlocked_or_fetch_8(char volatile* ptr, char val) {
//   return _InterlockedOr8(ptr, val) | val;
// }

// short interlocked_or_fetch_16(short volatile* ptr, short val) {
//   return _InterlockedOr16(ptr, val) | val;
// }

修改4:

// xor
// char interlocked_xor_fetch_8(char volatile* ptr, char val) {
//   return _InterlockedXor8(ptr, val) ^ val;
// }

// short interlocked_xor_fetch_16(short volatile* ptr, short val) {
//   return _InterlockedXor16(ptr, val) ^ val;
// }

修改5:
添加以下代码

int64_t str2int64(char *str) {
  char *endptr = NULL;
  return strtoll(str, &endptr, 10);
}

uint64_t htonll(uint64_t val)
{
    return (((uint64_t) htonl(val)) << 32) + htonl(val >> 32);
}

src/inc/taos.h

将要导出的函数添加

__declspec(dllexport)

例如:

__declspec(dllexport) void  taos_init();

需要导出的函数见 src/client/src/taos.def

cmake 转换

Configure 选择 MSYSMakefiles

Generator

make

进到转换后的目录执行 make
成功之后在编译目录的 build/bin 文件夹可以看到生成 taos.exe
build/lib 下存在以下文件

  • libiconv.a
  • libos.a
  • libpthread.a
  • libregex.a
  • libtaos.dll
  • libtaos.dll.a
  • libtals_static.a
  • libtrpc.a
  • libutil.a

cgo 使用

我们只需要关注 libtaos.dlllibtaos.dll.a
go 文件使用:

/*
#cgo CFLAGS : -I(taos.h文件文件夹)
#cgo LDFLAGS: (libtaos.dll.a文件位置)
*/

例如:

/*
#cgo CFLAGS : -IE:/software/msys64/usr/local/include
#cgo LDFLAGS: E:/software/msys64/usr/local/lib/libtaos.dll.a
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <taos.h>
*/
import "C"

运行时

程序运行时将 libtaos.dll 放到程序同级目录,需要保证服务端版本也是1.6.4.4。若版本不同请使用官方动态库改名使用(见注)。
注: 由于使用纯c编写使用vc编译器编译的动态库可以由 gcc 调用,所以官方提供的 taos.dll 可以改名为 libtaos.dll 使用。

原文地址:https://www.cnblogs.com/t102011/p/tdengine_windows.html

时间: 2024-10-17 12:26:36

基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用)的相关文章

windows平台下基于VisualStudio的Clang安装和配置

LLVM 是一个开源的编译器架构,它已经被成功应用到多个应用领域.Clang是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程语言.Clang 对源程序进行词法分析和语义分析,并将分析结果转换为 AST ( 抽象语法树 ) ,最后使用 LLVM 作为后端代码的生成器. Clang 的开发目标是提供一个可以替代 GCC 的前端编译器.与 GCC 相比,Clang 是一个重新设计的编译器前端,具有一系列优点,例如模块化,代码简

在windows环境下基于sublime text3的node.js开发环境搭建

首先安装sublime text3,百度一堆,自己找吧.理论上sublime text2应该也可以.我只能说一句:这个软件实在是太强悍了. 跨平台,丰富的插件体系,加上插件基本上就是一个强悍的ide了.目前我在使用的主要是Emmet.Python.还有一些格式化的插件(xml,json),加上这次安装的node.js. node.js的安装就不用多说了,直接http://nodejs.org/ 点击install下载window版本的安装程序后安装即可.默认的安装会将安装目录加到path环境变量

Windows 7下 搭建 基于 ssh 的sftp 服务器

Windows  xp 下 搭建 基于  ssh 的sftp 服务器,服务器端可以用 freesshd,F-secure server等,filezilla server不可用,之前傻乎乎的用filezilla 来做服务器,找不到任何有关sftp的配置选项,推荐用freesshd,免费.简单,直观,客户端可以用一般的支持sftp的都可以,filezilla,f-secure client 等,我用freesshd和filezillazilla 搭建sftp 服务,我在内网搭建的,如果在外网发布,

如何基于android4.4.2的源码和android-4.3.1_r1的驱动编译I9250的ROM

如何基于android4.4.2的源码和android-4.3.1_r1的驱动编译I9250的ROM 作者:雨水  2014-05-04 联系方式:dennis.hu.cd at gmail.com 说明:经过多番折腾,终于把自己编译的Android4.4.2的源代码成功地跑在我的三星Galaxy Nexus I9250手机上了.期间离不开一位外国朋友的帮助,也就是参考资料[1]的作者Sato Kensuke. 这里将过程记录下来,希望对大家有所帮助! 第一步:下载android-4.4.2_r

基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案

基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案 两个月前做C++课设的时候,电脑编译器编译结果出现了中文乱码,寻求了百度和大神们,都没有解决这个问题,百度上一堆解释是对编译器进行设置之类的,结果没有一个有效果,暑假学习了用Dos来开发Java程序,输入cmd命令中dir(directory)进行查询操作时,显示了一堆中文乱码,原本是想重装系统的,因为电脑里面重要东西有点多,所以自己花了一段时间捣鼓了一下电脑,终于解决了如上两个问题,现在心里很开心,附上如下两幅图: cm

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下)

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下) 昨天谈到了Mysql实现主从复制,但由于时间原因并未讲有关读写分离的实现,之所以有读写分离,是为了使数据库拥有双机热备功能,至于双机热备,特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备,双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式),主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状

windows平台下基于QT和OpenCV搭建图像处理平台

在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并且生成了相应的免费视频.这篇博客的主要内容,就是基于最新版本的相应工具,在windows平台下,"基于QT和OpenCV搭建图像处理平台",并且进一步研究如何基于QT所见即所得的便利,进行图像处理操作,最终还要和vs做一个比较,进行初步小结. 主要分为3个部分,一个是当前模式下,windows+Q

基于MVC+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出

数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform里面的通用导入导出模块的设计和开发过程,但在Web上我们应该如何实现呢?本文主要介绍利用MVC4+EasyUI的特点,并结合文件上传控件Uploadify 的使用,实现文件上传后马上进行处理并显示,然后确认后把数据写入数据库的过程. 我们知道,Web上对Excel的处理和Winform的有所差异,如果是在We

基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出

数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform里面的通用导入导出模块的设计和开发过程,但在Web上我们应该如何实现呢?本文主要介绍利用MVC4+EasyUI的特点,并结合文件上传控件Uploadify 的使用,实现文件上传后马上进行处理并显示,然后确认后把数据写入数据库的过程. 我们知道,Web上对Excel的处理和Winform的有所差异,如果是在We