>挑战:链接共享库
>>我最近在将源构建的库集成到本地C项目中时遇到了一个链接问题。 链接器在尝试链接到共享库时报告了错误。 与下面显示的错误消息相似,表明链接器找不到库中定义的符号:undefined reference
<code>/bin/ld: /tmp/ccHb7mJ8.o: in function `SDL_main': main.c:(.text+0x3c): undefined reference to `SDL_EnterAppMainCallbacks' ... (other undefined references) ... collect2: error: ld returned 1 exit status make: *** [Makefile:7: all] Error 1</code>
>故障排除步骤
最初的故障排除涉及使用各种方法多次重新编译库,但这一切都没有成功。 研究使我进入了一个论坛帖子,描述了与32位相关的类似问题与64位工具链有关的问题。 虽然我的环境被确认为64位,但这促使我考虑编译器本身。>
意外的解决方案:切换编译器> >我从GCC切换到Clang,汇编和链接完美地工作。 鉴于解决方案显然很简单,并且在过去的项目中缺乏类似问题,这令人惊讶。
一个受控的实验
为了进一步调查,我创建了一个简单的测试用例:一个共享库()实现
>函数,用clang编译,而驱动程序程序(>
libm.so
add
main.c
> lib.c:
<code class="language-c">#pragma once int add(int a, int b);</code>
main.c:
<code class="language-c">#include "lib.h" int add(int a, int b) { return a + b; }</code>
build_so.sh(clang):
<code class="language-c">#include "lib.h" #include <stdio.h> int main () { printf("4+3=%d\n", add(4, 3)); return 0; }</code>
build_main.sh(gcc):
<code class="language-bash">clang -std=c11 -c -o lib.o lib.c clang -shared -fPIC -o libm.so lib.o</code>
> 结论:编译器不兼容
<code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
以上是独特的共享库问题的详细内容。更多信息请关注PHP中文网其他相关文章!