go语言有很多的库,在开发c语言的时候为了快速完成某些功能,可以直接通过go语言的库进行调用.那么我们将go语言开发的程序编译成so动态库文件就可以给c或者c++程序调用.
目录
go文件编写
如果想要导出C能使用的动态库.我们需要将函数的名称编写为大写.
并且还需要添加导出注释(重要) //export HelloWorld 这个注释必须写,并且//后面不要有空格.
package main
/*
#include <stdlib.h>
*/
import "C"
import "fmt"
//export HelloWorld
func HelloWorld(str *C.char) *C.char{
fmt.Printf(C.GoString(str))
return str
}
func main() {
// fmt.Printf("Done\n")
}
so编译命令
go mod init test
go mod tidy
go build -buildmode=c-shared -o libtest.so
编译成功后会自动生成libtest.so 以及 libtest.h文件
可以通过一下命令检查是否编写编译成功.
readelf -a libtest.so| grep -i hello
C语言测试程序
main.c文件
#include "interface.h"
void main(int argc, char* argv[]) {
char * str = HelloWorld("asdf");
print(str);
}
如果libtest.h文件为自动生成,我们可以自己手动编写libtest.h文件
#ifndef __INTERFACE_H__
#define __INTERFACE_H__
char* HelloWorld(char *);
#endif
CMakeList.txt编写
cmake_minimum_required(VERSION 2.8)
project(demo)
# C++11 编译
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_STANDARD 11)
# set(CMAKE_SHARED_LINKER_FLAGS " -L./ -Wl,-rpath=./")
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
set( demo_SOURCE
${CMAKE_CURRENT_SOURCE_DIR}/main.c
)
link_directories(${PROJECT_SOURCE_DIR})
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
add_executable(demo ${demo_SOURCE})
target_link_libraries(demo -ltest )
编译C程序
mkdir build
cd build
cmake ..
make
运行
./demo