猿问

链接到 libavformat 的最小 Cgo 应用程序意外执行

我有一个最小的 C 程序


#include <libavformat/avformat.h>


AVFormatContext *open(const char *url) {

    printf("URL %s\n", url);

    AVFormatContext *ctx = NULL;

    int err = avformat_open_input(&ctx, url, 0, 0);

    return ctx;

}


int main(int argc, char **argv) {

    open(argv[1]);

}

它可以工作,它打印我传入的文件路径,并返回一个有效的 AVFormatContext。


我将代码粘贴到 Golang 程序中:


package main


// #include <libavformat/avformat.h>

//  AVFormatContext *open(const char *url) {

//  printf("URL %s\n", url);

//  AVFormatContext *ctx = NULL;

//  int err = avformat_open_input(&ctx, url, 0, 0);

//  return ctx;

//  }

//  #cgo LDFLAGS: -lavformat

import "C"

import (

    "fmt"

    "os"

)


func main() {

    fmt.Println("Lets try this")

    url := os.Args[1]

    C.open(C.CString(url))

}

这会打印URL /dev/urandom(无论我给它什么参数)并挂起。非常奇怪的是,它不打印Lets try this。这是在 Mac 上使用 ffmpeg 并从自制程序转到:


ffmpeg version 4.2.1

Copyright (c) 2000-2019 the FFmpeg developers   

built with Apple clang version 11.0.0 (clang-1100.0.33.8)


go version go1.13.4 darwin/amd64

我目前的猜测是编译器 ABI 不兼容,或者 libavformat 在 main() 之前运行某些内容?


繁星淼淼
浏览 109回答 1
1回答

犯罪嫌疑人X

问题出在函数名称上open。它屏蔽了系统调用 open,go 必须在到达 main 之前调用。
随时随地看视频慕课网APP

相关分类

Go
我要回答