返回顶部
首页 > 资讯 > 精选 >使用 gcc (mingw32) 编译带有静态库的 DLL
  • 583
分享到

使用 gcc (mingw32) 编译带有静态库的 DLL

typedeflsp 2024-02-09 09:02:01 583人浏览 八月长安
摘要

PHP小编百草为你介绍如何使用GCc (mingw32)编译带有静态库的DLL。在开发过程中,经常需要将静态库打包成DLL以便于在其他项目中调用。使用gcc (mingw32)编译带有

PHP小编百草为你介绍如何使用GCc (mingw32)编译带有静态库的DLL。在开发过程中,经常需要将静态库打包成DLL以便于在其他项目中调用。使用gcc (mingw32)编译带有静态库的DLL的方法相对简单,只需按照一定的步骤操作即可。首先,确保已安装mingw32和gcc编译器。然后,在命令行中输入gcc -shared -o libname.dll libname.a即可生成DLL文件。通过这种方式,你可以轻松地将静态库编译为DLL,以便在其他项目中使用。

问题内容

我有一个由外部工具(即 cGo)生成的静态库,我们将其称为 libsecondary.a。我想生成一个动态库,同时包含“libsecondary.a”作为依赖项,我在 libsecondary.h 中导出一个名为 onprocessinit() 的函数,并在 dll_process_attach 事件上调用它。

我尝试生成共享库,但似乎无法使用 x86_64-w64-mingw32-共享-l。 -lsecondary -static-libgcc -static-libstdc++ -static .\dllmain.c

错误输出是 dllmain.c:(.text+0x9b): 未定义对“onprocessinit”的引用,这是怎么回事?

这是头文件libsecondary.h






#line 1 "cgo-builtin-export-prolog"

#include 

#ifndef go_cgo_export_prologue_h
#define go_cgo_export_prologue_h

#ifndef go_cgo_gostring_typedef
typedef struct { const char *p; ptrdiff_t n; } _gostring_;
#endif

#endif










#line 1 "cgo-gcc-export-header-prolog"

#ifndef go_cgo_prologue_h
#define go_cgo_prologue_h

typedef signed char goint8;
typedef unsigned char gouint8;
typedef short goint16;
typedef unsigned short gouint16;
typedef int goint32;
typedef unsigned int gouint32;
typedef long long goint64;
typedef unsigned long long gouint64;
typedef goint64 goint;
typedef gouint64 gouint;
typedef size_t gouintptr;
typedef float gofloat32;
typedef double gofloat64;
#ifdef _msc_ver
#include 
typedef _fcomplex gocomplex64;
typedef _dcomplex gocomplex128;
#else
typedef float _complex gocomplex64;
typedef double _complex gocomplex128;
#endif


typedef char _check_for_64_bit_pointer_matching_goint[sizeof(void*)==64/8 ? 1:-1];

#ifndef go_cgo_gostring_typedef
typedef _gostring_ gostring;
#endif
typedef void *gomap;
typedef void *gochan;
typedef struct { void *t; void *v; } gointerface;
typedef struct { void *data; goint len; goint cap; } goslice;

#endif



#ifdef __cplusplus
extern "c" {
#endif

extern __declspec(dllexport) void onprocessinit();

#ifdef __cplusplus
}
#endif

这是 dllmain.c

65be0f35ebbcbc

这是导出的 golang 函数(我使用 go build -buildmode=c-arcHive 编译的函数)

package main
import "C"
import (
    "unsafe"
    "syscall"
)

//export OnProcessInit
func OnProcessInit() {
    const (
        NULL  = 0
        MB_OK = 0
    )
    caption := "Hola"
    title := "desdegoo"
    ret, _, _ := syscall.NewLazyDLL("user32.dll").NewProc("MessageBoxW").Call(
        uintptr(NULL),
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))),
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))),
        uintptr(MB_OK))

    if ret != 1 {
        return
    }
    return 
}

func main() {}

解决方法

哇,答案是论证位置,

x86_64-w64-mingw32 -shared -static-libgcc -static-libstdc++ -static .\dllmain.c .\libsecondary.a

如果你向后输入它,它将找不到来自 libsecondary.a 的引用,天哪......

上面的代码在加载时也会陷入死,因为 syscall.NewLazyDLL 调用 LoadLibraryA,并且它被锁定在 DLL_PROCESS_ATTACH 中,所以解决方法是 CreateThread 并在线程内运行 golang 导出函数:)

以上就是使用 gcc (mingw32) 编译带有静态库的 DLL的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 使用 gcc (mingw32) 编译带有静态库的 DLL

本文链接: https://lsjlt.com/news/562376.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用 gcc (mingw32) 编译带有静态库的 DLL
    php小编百草为你介绍如何使用gcc (mingw32)编译带有静态库的DLL。在开发过程中,经常需要将静态库打包成DLL以便于在其他项目中调用。使用gcc (mingw32)编译带有...
    99+
    2024-02-09
    typedef lsp
  • Linux下怎么用GCC编译动态库
    这篇文章主要讲解了“Linux下怎么用GCC编译动态库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux下怎么用GCC编译动态库”吧!本文主要解决以下几个问题   1 为什么要使用库?...
    99+
    2023-06-13
  • GCC指令及动态库、静态库怎么使用
    本文小编为大家详细介绍“GCC指令及动态库、静态库怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“GCC指令及动态库、静态库怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、GCC1.1 GCC ...
    99+
    2023-07-04
  • GCC 指令详解及动态库、静态库的使用方法
    目录一、GCC1.1 GCC 介绍1.2 安装 GCC1.3 GCC 工作流程1.3.1 一般使用流程1.3.2 详细的工作流程1.4 GCC 常用参数1.4.1 指定一个宏(-D)...
    99+
    2022-11-13
    GCC 指令 GCC使用动态库 GCC使用静态库
  • Python静态编译器的用法
    本篇内容介绍了“Python静态编译器的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下:   &n...
    99+
    2023-06-17
  • 关于使用rust调用c++静态库并编译nodejs包的问题
    目录一、创建项目二、Cargo.toml三、package.json四、代码分析在项目上经常要用到身份证阅读器、护照阅读仪、指纹仪等各种品牌硬件,假如每套系统的都做集成开发那代码的维...
    99+
    2022-11-13
    rust调用c++静态库 c++编译nodejs包
  • Go语言非main包如何编译为静态库并使用
    这篇文章主要介绍“Go语言非main包如何编译为静态库并使用”,在日常操作中,相信很多人在Go语言非main包如何编译为静态库并使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言非main包如何编译为...
    99+
    2023-06-20
  • Go语言非main包编译为静态库并使用的示例代码
    Go语言项目中基本上都是以源码的形式提供包,对公司或者企业而言,如果想要隐藏关键代码怎么办? 我们可以将Go的非main包编译为静态库提供给用户使用。下面以Windows为例,介绍一...
    99+
    2024-04-02
  • Groovy 2.0静态类型检查及如何使用编译功能
    Groovy 2.0静态类型检查及如何使用编译功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Groovy开发团队近日发布了2.0的版本,Groovy是基于Java虚拟机(J...
    99+
    2023-06-17
  • linux静态库和动态库的创建与使用方法
    这篇文章主要介绍“linux静态库和动态库的创建与使用方法”,在日常操作中,相信很多人在linux静态库和动态库的创建与使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux静态库和动态库的创建与使...
    99+
    2023-06-13
  • 使用vs2022在.net6中调试带typescript的静态页面
    1、新建一个空的web项目 2、设计、建好目录结构 其中ts存放typescript源文件,web为网站根目录,scripts/js存放ts生成的js脚本。 index.html...
    99+
    2024-04-02
  • 如何使用vs2022在.net6中调试带typescript的静态页面
    小编给大家分享一下如何使用vs2022在.net6中调试带typescript的静态页面,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、新建一个空的web项目2、设计、建好目录结构其中ts存放typescript源文件,...
    99+
    2023-06-22
  • 使用静态ip地址的好处有哪些
    本篇文章为大家展示了使用静态ip地址的好处有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、能够有效避免用户的输入错误。利用静态IP的时候还支持泛域名解析,简而言之泛域名解析就是说可以支持无限...
    99+
    2023-06-20
  • PHP中私有静态方法的使用详解
    PHP是一种广泛应用的编程语言,其面向对象特性使得代码的结构更加清晰和可维护。在PHP中,除了常见的公有方法和属性外,还存在私有方法和私有属性,它们只能在类的内部访问,而无法在外部直接...
    99+
    2024-04-02
  • C++ 静态函数的使用场景有哪些?
    静态函数在 c++++ 中用于与类无关的操作或实用程序功能,包括:效用函数:提供独立的实用程序功能,如字符串操作或数学运算。工厂方法:创建类的新实例,返回指针或引用。常量函数:访问常量数...
    99+
    2024-04-16
    c++ 静态成员函数 作用域
  • Python 反编译:pyinstxtractor工具和uncompyle6库的使用
    uncompyle6 现仅适用于 Python 2.4 到 3.8 版本 Python 3.9 及以上版本请参见我另外一篇博客: Python 反编译:pycdc工具的使用 ✅作者简介:人工智能...
    99+
    2023-09-04
    python 开发语言
  • C++封装静态链接库和使用的详细步骤
    目录零碎记事为什么要把程序封装成库博主的环境封装步骤准备好待封装的程序开始封装配置项目编译找到编译好的静态库打包使用静态库使用步骤包含头文件添加链接路径源文件设置项目设置零碎记事  ...
    99+
    2022-11-13
    C++静态链接库 C++静态链接库使用
  • 如何正确使用PHP中的私有静态方法
    使用PHP中的私有静态方法是一种保护类内部逻辑的有效方式。私有静态方法只能在同一个类内部进行调用,外部无法访问,从而保证了程序的安全性和封装性。在编写PHP代码时,正确使用私有静态方法...
    99+
    2024-04-02
  • 深入探讨PHP私有静态方法的定义和使用
    PHP是一种非常流行的编程语言,经常用于Web应用程序开发。在PHP中,可以使用静态方法来执行一些与类相关的任务,而私有静态方法则是PHP面向对象编程中的一种特殊类型。在本文中,我们将深入探讨PHP私有静态方法的用途、如何定义和使用,以及它...
    99+
    2023-05-14
    私有静态方法 php
  • 优化的方法:如何有效使用显式编译标志?
    有志者,事竟成!如果你在学习Golang,那么本文《优化的方法:如何有效使用显式编译标志?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧...
    99+
    2024-04-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作