当前位置: > > > > 如何使用 CMake 将 Go 代码编译并链接到 C++
如何使用 CMake 将 Go 代码编译并链接到 C++
来源:stackoverflow
2024-04-20 09:12:31
0浏览
收藏
本篇文章给大家分享《如何使用 CMake 将 Go 代码编译并链接到 C++》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。
问题内容
我正在尝试将 go 代码编译到库中,然后使用 cmake 链接 c++ 和 lib。
我已经尝试过使用 gcc 制作共享库,如下 https://medium.com/swlh/build-and-use-go-packages-as-c-libraries-889eb0c19838。
go build -o cas.so -buildmode=c-shared cmd/c-mock-server/main.go gcc -o main main.c ./cas.so
所以现在我需要创建共享库并使用 cmake 将其与 c++ 代码链接,但我真的不知道如何做到这一点
正确答案
在使用 cmake 之前构建项目结构:
# tree . . ├── cmakelists.txt ├── go │ ├── cmakelists.txt │ ├── go.mod │ └── module.go └── test.cpp
文件
./cmakelists.txt
cmake_minimum_required(version 3.0)
project(test)
add_subdirectory(go)
set(target test)
set(srcs test.cpp)
add_executable(${target} ${srcs})
target_link_libraries(${target} goshim pthread)
./test.cpp
#include <iostream>
#include <string>
#include "go/module.h"
int main() {
int res = add(1, 2);
std::cout << res << std::endl;
gostring str;
str.p = "hello world";
str.n = strlen(str.p);
print(str);
std::string s = "go-module";
char *cstr = new char[s.length()+1];
std::strcpy (cstr, s.c_str());
cstr = strfxn(cstr);
std::cout << cstr << std::endl;
delete[] cstr;
return 0;
}
./go/cmakelists.txt
cmake_minimum_required(version 3.0)
project(test_go)
set(target shim_go)
set(srcs module.go)
set(lib module.so)
add_custom_command(output ${cmake_current_binary_dir}/${lib}
depends ${srcs}
working_directory ${cmake_current_source_dir}
command env gopath=${gopath} go build -buildmode=c-archive
-o "${cmake_current_binary_dir}/${lib}"
${cmake_go_flags} ./...
comment "building go library")
add_custom_target(${target} depends ${lib} ${header})
add_library(goshim static imported global)
add_dependencies(goshim ${target})
set_target_properties(goshim
properties
imported_location ${cmake_current_binary_dir}/${lib}
interface_include_directories ${cmake_current_binary_dir})
./go/module.go
package main
import "c"
import (
"sort"
"fmt"
)
//export add
func add(a, b int) int {
return a + b
}
//export sub
func sub(a, b int) int {
return a - b
}
//export print
func print(str string) {
fmt.printf("go prints: %s\n", str)
}
func strfxn(input string) string {
return "hello " + input + " world"
}
//export strfxn
func strfxn(cinput *c.char) *c.char {
// c data needs to be manually managed in memory.
// but we will do it from c++.
input := c.gostring(cinput)
return c.cstring(strfxn(input))
}
//export sort
func sort(vals []int) {
sort.ints(vals)
}
func main() {
// we need the main function to make possible
// cgo compiler to compile the package as c shared library
}
./go/go.mod
total 16 module demo/module go 1.16
运行
# cmake . -- The C compiler identification is AppleClang 12.0.0.12000032 -- The CXX compiler identification is AppleClang 12.0.0.12000032 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /tmp/demo # make [ 33%] Building Go library [ 33%] Built target shim_go [ 66%] Building CXX object CMakeFiles/test.dir/test.cpp.o [100%] Linking CXX executable test [100%] Built target test # ./test 3 Go prints: Hello World Hello Go-Module World
今天关于《如何使用 CMake 将 Go 代码编译并链接到 C++》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注米云公众号!
