gpt4 book ai didi

c - 操作系统 : Undefined symbols in C when said symbols exist

转载 作者:太空宇宙 更新时间:2023-11-04 04:57:16 26 4
gpt4 key购买 nike

奇怪的事情正在发生。

我有一个使用 CMake 编译的 C 语言静态库。

我反对在 Ubuntu 上构建可执行文件,但在 Snow Leopard 下,当我尝试这样做时出现 undefined symbol 错误:

per-ms006:mbuild douglasl$ make
Linking C executable Sample
Undefined symbols:
"_na_Gfx_Impl", referenced from:
_na_impl_render in libdesktop.a(impl.c.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[2]: *** [Sample] Error 1
make[1]: *** [CMakeFiles/Sample.dir/all] Error 2
make: *** [all] Error 2

这对我来说很神秘,因为静态库上的 nm 显示:

...(省略一堆东西)...

libdesktop.a(impl.c.o):
0000000000003a30 s EH_frame1
0000000000003990 s LC0
00000000000039a0 s LC1
00000000000039ac s LC2
00000000000039d0 s LC3
00000000000039f0 s LC4
00000000000039fc s LC5
0000000000003a0c s LC6
0000000000003a1b s LC7
0000000000003a2a s LC8
U _SDL_PollEvent
U _free
U _malloc
U _na_Gfx_Impl <----------- Symbol is there.
0000000000000209 T _na_impl_api
0000000000003b38 S _na_impl_api.eh
U _na_impl_assets_create
U _na_impl_events_create
U _na_impl_events_destroy
U _na_impl_gfx_create
U _na_impl_gfx_destroy
0000000000000124 T _na_impl_init
0000000000003aa8 S _na_impl_init.eh
0000000000000021 T _na_impl_log
0000000000003a78 S _na_impl_log.eh
0000000000000159 T _na_impl_poll
0000000000003ad8 S _na_impl_poll.eh
00000000000002d0 T _na_impl_release
0000000000003b68 S _na_impl_release.eh
000000000000018e T _na_impl_render
0000000000003b08 S _na_impl_render.eh
U _na_impl_shared_assets_destroy
U _na_impl_shared_error
0000000000000000 T _na_impl_version
0000000000003a48 S _na_impl_version.eh
U _printf
U _putchar
U _vprintf

na_Gfx_Impl 没什么特别的,它只是一个结构;重复一遍,这段代码在我的 ubuntu 系统上编译得很好。

我对 osx 库链接的了解还不够,不知道这里出了什么问题,但是……它只是一段 C 代码;这肯定是我做错了什么,而不是 OSX 有什么奇怪的地方。

救命啊! :)

编辑:

作为引用,定义了结构:

/** Implementation struct. */
struct na_Gfx_Impl {

/** Parent. */
struct na_Gfx *gfx;

/** SDL surface for rendering. */
SDL_Surface *screen;

/** Handler for sprites. */
struct na_utils_SetHandler *key;

/** Set of texture values. */
GLfloat *texture;

/** Set of vextex values. */
GLfloat *vertex;
};

并使用:

/** Render implementation. */
int na_impl_render(struct na_Api *api) {
struct na_Gfx_Impl *impl = (struct na_Gfx_Impl *) (api->gfx->impl);
...

但是,我的结论是一定有什么地方被严重搞砸了。结构符号没有理由(据我所知)出现在静态库中。

最佳答案

我不确定这是否是您的确切问题,但是在静态编译库时,链接的顺序通常很重要。您要确保最低级别的功能最后排序。

关于c - 操作系统 : Undefined symbols in C when said symbols exist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5138610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com