c - 如何在 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 内容等吗?非常感谢您的帮助。
谢谢,萨丁德
解决方案
推荐阅读
- sql - 如何根据另一列的分位数将新列插入具有标签 '1'/'2'/'3'/'4' # 的数据库中?
- neo4j - 如何在 Neo4j 中解析 json 并使用 foreach 创建节点?
- php - 获取数据库中的数据并合并重复数据
- c++ - 这样做的正确方法是什么?调用指针到指针到指针中的函数?
- kubernetes - 没有为版本“cronjobber.hidde.co/v1alpha1”注册任何类型的“TZCronJob”
- jestjs - 在不同的测试之间模拟相同的值
- node.js - 在我的nestjs模块中导入另一个模块的存储库
- azure-devops - 如何授予我的 ADO 项目的管理员权限?
- javascript - fullcalendar 根据屏幕宽度动态更改默认视图
- opengl - OpenGL 1.1:调用 glNormalPointer() 后可以释放内存吗?