go - CGO 忽略 MacOS 上的 LDFLAGS -L 选项
问题描述
我正在尝试在 MacOS 机器上编译以下代码
// #cgo darwin LDFLAGS: -L${SRCDIR}/build/darwin -lprocessing_lib
// #cgo linux LDFLAGS: -L${SRCDIR}/build/linux -lprocessing_lib
// #include "Processing-bridge.h"
// #include <stdlib.h>
import "C"
import "unsafe"
type ProcessorWrapper struct {
ptr unsafe.Pointer
}
func init() {
pr.ptr = C.NewProcessor()
}
func GetDefault() (id int, name string) {
var default = C.GetDefault(pr.ptr)
id = int(default.materialId)
name = C.GoString(default.name)
return
}
我在 LDFLAGS 中定义的正确位置有 libprocessing_lib.so 文件。但是编译器仍然会抛出一个错误说
dyld: Library not loaded: build/lib_processing_lib.so
Referenced from: /Users/ag/workspace/src/github.com/apremalal/pq-processor/./pq-processor
Reason: image not found
一旦我将 build/lib_processing_lib.so 复制到项目的根目录,它就可以工作。
LDFLAGS 提供的库目录似乎被某种方式覆盖了。
我注意到在编译之前设置 DYLD_LIBRARY_PATH 变量也会覆盖这个值。(我在没有设置这个参数的情况下运行了上面的场景)
有趣的是,虽然相同的代码通过选择正确的路径在 Linux 环境中工作。
为了获得理想的 LDFLAGS 行为,我需要在 MacOS 中做些什么特别的事情吗?
解决方案
DYLD_LIBRARY_PATH
设置动态库加载路径。对于 linux的 mac 设置LD_LIBRARY_PATH
推荐阅读
- google-api - 我可以使用 GoogleDrive 中的默认文件类型图标吗?
- java - java net.sf.jasperreports.engine.JRRuntimeException: java.io.IOException: 系统找不到指定的路径
- python - 如何将分类变量中的 1 值重命名为列的标题?
- security - 如何将 CSRF 令牌从服务器传递到客户端?
- c++ - 用非原子读取排序原子读取
- mysql - Mysql Views 问题(重复)
- c++ - 代码行 1 中的 '(void)' 有什么用?
- css - 为什么我的链接样式表不起作用?
- mysql - 如何使这个设计数据库不可知?
- python - 在熊猫中用空白替换重复的值