登录
首页 >  Golang >  Go问答

使用 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.goc 注释的顶部:

#cgo LDFLAGS: -L -lrawgo -lraw

该指令告诉编译器将此行添加到链接器标志中。

抱歉,我不知道如何修改您的 cmake 和 swig 设置以自动生成此行。

终于介绍完啦!小伙伴们,这篇关于《使用 swig 在 go 中封装 C++ 库》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>