Golang调用C函数

2023-02-23

golang仅支持c函数调用

C函数实例

目录结构

.
├── CMakeLists.txt
├── includes
│   └── library.h
└── src
    └── library.cpp

源码

library.h

#ifndef PDVCLIBRARY
#define PDVCLIBRARY

#ifdef __cplusplus
extern "C"{
#endif

extern int testFunc();

#ifdef __cplusplus
}
#endif

#endif

library.cpp

#include "library.h"
#include <iostream>


int testFunc()
{
    unsigned int sum = 0;
    for (size_t i = 0; i < 100; i++)
    {
        sum += i;         
    }
    return sum;    
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(CLibiary VERSION 0.1 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 11)


include_directories(
    ./includes/
)

FILE(GLOB CLibiary_Header "./includes/*.h")
FILE(GLOB CLibiary_SRC "./src/*.cpp")

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/build/libs/$<0:>")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/build/bin/$<0:>")

#静态库
set(CLibiary_Target_STATIC "CLibiarySTATIC")
add_library(${CLibiary_Target_STATIC} STATIC  ${CLibiary_Header} ${CLibiary_SRC})
target_link_libraries(${CLibiary_Target_STATIC} -Wall -pthread)

#动态库
set(CLibiary_Target_SHARE "CLibiarySHARED")
add_library(${CLibiary_Target_SHARE} SHARED  ${CLibiary_Header} ${CLibiary_SRC})
target_link_libraries(${CLibiary_Target_SHARE} -Wall -pthread)


file(COPY ./includes/ DESTINATION ./build/includes/)

动态库

目录结构

需要拷贝头文件和动态库到golang项目中,或使用CFLAGS和LDFLAGS指定外部目录,详细使用方法golang语法

.
├── go.mod
├── libCLibiarySHARED.so
├── library.h
├── main.go

main.go
```golang package main

import “fmt”

/* #include “library.h” #cgo CFLAGS: -I. #cgo LDFLAGS: -L. -lCLibiarySHARED */ import ( “C” )

func main() { val := C.testFunc() fmt.Println(val) }


## 静态库  
### 目录结构  
> 注释同动态库目录结构  
```text
.
├── go.mod
├── libCLibiarySTATIC.a
├── library.h
├── main.go

main.go

package main

import "fmt"

/*
#include "library.h"
#cgo CFLAGS: -I.
#cgo LDFLAGS: -L. -lCLibiarySTATIC -lstdc++
*/
import (
	"C"
)

func main() {
	val := C.testFunc()
	fmt.Println(val)
}