使用 swig 在 go 中封装 C++ 库
来源:stackoverflow
时间:2024-02-11 15:15:25 469浏览 收藏
大家好,我们又见面了啊~本文《使用 swig 在 go 中封装 C++ 库》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~
问题内容
我成功地用 swig
包装了一个大型 c++
库。我发布了该模块并且可以安装它,但是当我去构建它时,我在生成的 c
文件中包含的函数中收到大量 undefined reference
错误。
我将生成的so
lib文件放在我的系统lib目录中,并将库中的头文件放入我的系统include目录中,但这并没有解决问题。我猜测我还需要一个用于包装 c
文件的头文件,以便解释器可以知道 so
文件中的内容,但鉴于 swig
没有生成一个头文件,我不知道是否缺少其他任何内容。我将尝试编写自己的头文件以查看是否可以解决错误,但即使可以解决,这不应该是 swig
会自动执行的操作吗?
我的源文件如下
/** file: golibraw.i **/ %module librawgo %{ #define libraw_library_build /* put headers and other declarations here */ #include "libraw/libraw.h" #include "libraw/libraw_alloc.h" #include "libraw/libraw_const.h" #include "libraw/libraw_datastream.h" #include "libraw/libraw_internal.h" #include "libraw/libraw_types.h" #include "libraw/libraw_version.h" %} %include "libraw/libraw.h" %include "libraw/libraw_alloc.h" %include "libraw/libraw_const.h" %include "libraw/libraw_datastream.h" %include "libraw/libraw_internal.h" %include "libraw/libraw_types.h" %include "libraw/libraw_version.h"
cmake_minimum_required(VERSION 3.14) if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} ) message( FATAL_ERROR "In-source builds not allowed. Please make a new directory and run CMake from there. You may need to remove CMakeCache.txt." ) endif() find_package(SWIG 4.0 COMPONENTS python OPTIONAL_COMPONENTS go) if(SWIG_FOUND) message("SWIG found: ${SWIG_EXECUTABLE}") include (UseSWIG) if(NOT SWIG_go_FOUND) message(FATAL_ERROR "SWIG go bindings cannot be generated") endif() else() message(FATAL_ERROR "SWIG NOT FOUND") endif() set(PROJECT_NAME librawgo) project(${PROJECT_NAME}) SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/librawgo CACHE PATH "Single Directory for all" ) find_program( CLANG_TIDY NAMES clang-tidy) set(${PROJECT_NAME}_sources ${CMAKE_SOURCE_DIR}/src/librawgo.i ) swig_add_library(${PROJECT_NAME} TYPE SHARED LANGUAGE go SOURCES ${${PROJECT_NAME}_sources}) if(CLANG_TIDY) set_property( TARGET ${PROJECT_NAME} PROPERTY CXX_CLANG_TIDY "${CLANG_TIDY}") endif() set_property(TARGET ${PROJECT_NAME} PROPERTY SWIG_COMPILE_OPTIONS -go -intgosize 64 -cpperraswarn) set_property(TARGET ${PROJECT_NAME} PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR})
正确答案
原因是 go 编译器不知道库 librawgo.so
。
将以下行放在 librawgo.go
中 c
注释的顶部:
#cgo LDFLAGS: -L-lrawgo -lraw
该指令告诉编译器将此行添加到链接器标志中。
抱歉,我不知道如何修改您的 cmake 和 swig 设置以自动生成此行。
终于介绍完啦!小伙伴们,这篇关于《使用 swig 在 go 中封装 C++ 库》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!
声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
-
502 收藏
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
最新阅读
更多>
-
139 收藏
-
204 收藏
-
325 收藏
-
477 收藏
-
486 收藏
-
439 收藏
-
357 收藏
-
352 收藏
-
101 收藏
-
440 收藏
-
212 收藏
-
143 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习