首页 > 解决方案 > 如何在 cgo 中使用操作系统特定的库路径?

问题描述

我写了一个调用 C 库函数的 golang 代码。但是如果我想为其他操作系统(如 Linux/MacOS/Windows)交叉编译它,我如何设置自定义路径到库中的#cgo CFLAGS#cgo LDFLAGS

我试过这个例子:

// platform.go
package main

/*

#if defined(_WIN64)
    #define LIB_PATH "lib/win64"
#elif defined(__linux__)
    #define LIB_PATH "lib/linux"
#elif defined(__APPLE__) && defined(__MACH__) // Apple OSX and iOS (Darwin)
    #define LIB_PATH "lib/darwin"
#endif

#cgo CFLAGS: -I./include
#cgo LDFLAGS: -L./${LIB_PATH} -lsaplinglib -lpthread -ldl

#include "saplinglib.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// Return a name of platform, if determined, otherwise - an empty string
const char *get_platform_name() {
    return (LIB_PATH == NULL) ? "" : LIB_PATH;
}

int test() {
    puts(get_platform_name());
    return 0;
}

*/
import "C"

import (
    "fmt"
)

func main() {
    fromC := C.int(0)
    fromC = C.test()
    fmt.Println(C.int(fromC))
}

但它在输出中出错:

go run platform.go
/Users/satinder/example/platform.go: malformed #cgo argument: -L./${LIB_PATH}

例如,我的图书馆的树看起来像这样:

➜  example tree
.
├── include
│   └── saplinglib.h
├── lib
│   ├── darwin
│   │   └── libsaplinglib.a
│   ├── linux
│   │   └── libsaplinglib.a
│   └── win64
│       └── saplinglib.lib
└── platform.go

5 directories, 5 files

我的编码环境是 MacOS,所以我在 MacOS/Darwin 编译库上进行编码和测试。

但我需要自动化这一切以在 Linux 机器上进行交叉编译,为 Linux/MacOS/Windows 制作二进制文件。

我尝试寻找与 cgo 相关的问题,建议尝试pkg-config,但答案并不清楚如何。如果我可以使用pkg-config,有人可以为我的用例提供一些示例 pkg-config 内容等吗?非常感谢您的帮助。

谢谢,萨丁德

标签: cgocgo

解决方案


推荐阅读