【问题标题】:Linking a shared library using gcc使用 gcc 链接共享库
【发布时间】:2010-10-18 01:57:59
【问题描述】:

我在 windows 目标上使用 Real View 编译器工具 (RVCT 3.2) 创建了一个共享库 (*.so)。然后我尝试在 linux 系统上使用 gcc 将此 *.so 文件与我的应用程序链接。

将这个共享库链接到我的应用程序 linux 的 gcc 选项是什么?

我的问题是,-shared 选项是用作

gcc -shared myfile.so

...,用于创建 SO 文件或链接 SO 文件?我相信它会产生类似的东西:

gcc -lmyfile.so

这就够了吗?或者是否有任何其他开关告诉链接器它是一个动态库(共享对象)?

【问题讨论】:

    标签: gcc linker shared-libraries


    【解决方案1】:

    对我有用的是:

    gcc -L. -l:myfile.so
    

    【讨论】:

    • -L{path to file contains library} -l${library name} 如果我在 /home/newhall/lib/ 中有一个名为 libmine.so 的库,那么我将执行以下操作来链接它进入我的程序: $gcc -o myprog myprog.c -L/home/newhall/lib -lmine Reference Site
    • 对于那些想知道冒号的人来说,它让链接器查找具有指定确切名称的文件,而不是寻找名称的变体。见stackoverflow.com/a/48540643/1175455
    • 链接时动态库(.so)和静态库(.a)有什么区别吗?我一直认为动态库只在运行时使用,而不是在编译时使用。我错过了什么吗?
    • 这表示“未定义的引用”,但它是在文件中定义的。为什么?
    【解决方案2】:

    gcc -lmyfile 应该足够了(前提是你的库被命名为libmyfile.so)。链接器尽可能搜索共享对象,AFAIK 更喜欢它们。

    【讨论】:

    • 我有一个相关的问题:如果我的库 libmyfile.so 是 libyourfile.so 的符号链接,那么使用 gcc -lmyfile 链接我的程序是否仍然有效? (我需要保持某些不知道库名称更改的客户端的向后兼容性。)
    • @jpalecek 如果文件名具有扩展名 .dll 是否有效?
    • 如果库不在/usr/bin/ld中怎么办?
    • 添加选项-L/path/to/so/folder/.so添加搜索文件夹
    • 我试图在 Eclipse CDT 中链接 libraryName.dll,但是当我指定完整文件名时它无法链接 - 它仅在指定文件名没有扩展名时有效:libraryName。所以链接器选项是-llibraryName
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    相关资源
    最近更新 更多