如何解决Clang 链接器找到了一些符号,但没有找到其他符号 版本nim c叮当声
在我的 .nim
代码中,我使用 header
编译指示包含来自 /usr/local/include/node/node_api.h
(然后包含 /usr/local/include/node/js_native_api.h
)的符号。
proc napi_create_function(
env: napi_env,utf8name: cstring,length: csize_t,cb: napi_callback,data: pointer,res: napi_value
): int {.header:"<node/node_api.h>".}
当我运行 nim c foo.nim
时,对于 Undefined symbols for architecture x86_64
中的符号,我得到 js_native_api.h
(例如:napi_create_function
),但是 node_api.h
中的符号由链接器。请记住,node_api.h
包括 js_native_api.h
(如所见 here)。
Undefined symbols for architecture x86_64:
"_napi_create_function",referenced from:
_createFn__NEWhgHCwqbksHULYRnxXfA in @m..@s..@s..@s.nimble@spkgs@snapibindings-0.1.0@snapibindings.nim.c.o
根本问题可能与 Nim 无关,但我不知道如何使用 clang
来检查问题是否可以在没有 Nim 的情况下重现。
所以我的问题是:
如何让链接器找到丢失的符号?
版本
- nim v1.4.8
- clang v12.0.0
- x86_64-apple-darwin19.6.0
- nodejs v14.13.1(与 Homebrew 一起安装到
/usr/local/Cellar/node/14.13.1
)
nim c
/Users/alec/.nimble/bin/nim
c
--colors:on
--noNimblePath
-d:NimblePkgVersion=0.1.0
--path:/Users/alec/.nimble/pkgs/nimdbx-0.4.1
--path:/Users/alec/.nimble/pkgs/nimterop-0.6.13
--path:/Users/alec/.nimble/pkgs/regex-0.19.0
--path:/Users/alec/.nimble/pkgs/unicodedb-0.9.0
--path:/Users/alec/.nimble/pkgs/cligen-1.5.4
--path:/Users/alec/.nimble/pkgs/cbor-0.6.0
--path:/Users/alec/.nimble/pkgs/napibindings-0.1.0
--path:'/Users/alec/.nimble/pkgs/docopt-#master'
--path:/Users/alec/.nimble/pkgs/regex-0.19.0
--path:/Users/alec/.nimble/pkgs/unicodedb-0.9.0
--hints:off
-o:/Users/alec/my-project/dist/foo
/Users/alec/my-project/foo.nim
叮当声
clang
-o
/Users/alec/my-project/foo
/Users/alec/.cache/nim/foo_d/stdlib_assertions.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_dollars.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_formatfloat.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_io.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_system.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snapibindings-0.1.0@snapibindings@sutils.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snapibindings-0.1.0@snapibindings.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_parseutils.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_math.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_unicode.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_strutils.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_posix.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_options.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_times.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_os.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_hashes.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_tables.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snimterop-0.6.13@snimterop@sglobals.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_streams.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_lexbase.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_parsejson.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_json.nim.c.o
/Users/alec/.cache/nim/foo_d/stdlib_cpuinfo.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snimdbx-0.4.1@snimdbx@sprivate@slibmdbx.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snimdbx-0.4.1@snimdbx@sprivate@svals.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snimdbx-0.4.1@snimdbx@sError.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snimdbx-0.4.1@snimdbx@sDatabase.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snimdbx-0.4.1@snimdbx@sData.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snimdbx-0.4.1@snimdbx@sCollection.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snimdbx-0.4.1@snimdbx@sTransaction.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@snimdbx-0.4.1@snimdbx@sCRUD.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@sdata.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@sdata@sfrom_json.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@sdata@sto_json.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@squery.nim.c.o
/Users/alec/.cache/nim/foo_d/@m..@s..@s..@s.nimble@spkgs@scbor-0.6.0@scbor.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@sdata@sfrom_cbor.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@sdata@sto_cbor.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@sref.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@squery@sdocument.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@sfunctions.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoopkg@seval.nim.c.o
/Users/alec/.cache/nim/foo_d/@mfoo.nim.c.o
-lm
/Users/alec/.nimble/pkgs/nimdbx-0.4.1/libmdbx-dist/libmdbx.a
-ldl
解决方法
所以我的问题是:
如何让链接器找到丢失的符号?
- 确保您实际上正在链接一个包含您需要的符号的库(静态或动态)。 (请说明您如何链接它。)
- 确保您的库实际上具有正确的符号(使用十六进制编辑器打开文件并搜索符号)
- 确保这个库的架构正确。有一些工具可以让您检查这一点。 (在 Windows 上是
dumpbin /headers file
) - 确保您正确导入它。 (我只看到 {.header.} pragma 但其他需要的 pragma 缺席)。请显示更多代码和命令行。以便我们进一步调查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。