首页 > 后端开发 > C++ > 独特的共享库问题

独特的共享库问题

Patricia Arquette
发布: 2025-01-28 14:03:11
原创
365 人浏览过

Unique Shared Library Problem

>挑战:链接共享库

>

>我最近在将源构建的库集成到本地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.h:
  • > 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>
    登录后复制
  • 这导致与我的原始项目相同的错误。 但是,当修改
  • 脚本以使用clang时,问题就解决了。 进一步的实验逆转了编译器角色(图书馆的GCC,主要程序的clang),并且该组合正常工作。

    > 结论:编译器不兼容

    <code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
    登录后复制
  • >调查显示出明显的不兼容性:与GCC相关时,张别的共享库似乎存在问题,而反向情景无问题。这可能解释了为什么我以前没有遇到这个问题,因为我通常在项目的所有部分中使用相同的编译器。 这种不兼容的根本原因尚不清楚,但是当整合使用不同编译器构建的库时,它突出了潜在的陷阱。 如果有人知道解决方法,我会非常有兴趣听到。
>

以上是独特的共享库问题的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板