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.gomain.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)
}
