【问题标题】:GCC, linking libraries, not found?GCC,链接库,没有找到?
【发布时间】:2011-08-06 16:26:44
【问题描述】:
  • 操作系统:Windows 7 Pro X64
  • IDE:面向 C/C++ 开发人员的 Eclipse IDE
  • 编译器:MinGW(最新,4.5.2)

编译 HelloWorld.c 有效;但是当我尝试添加一些外部库时,它会窒息。

我将 .a 和 .dll 文件添加到我的“库”中;将两者的路径添加到 PATH 和库路径。我还放置了包含文件并配置了包含。据说我拥有的库与 win/mingw 兼容。他们还为 MSVC 提供了不同的下载方式。

令人沮丧。 ld.exe 给出了完整的路径,显然在那里,我有权读/写它们。我也将它们包含在没有路径的情况下(它们在库路径和路径中)。

我不明白为什么这不起作用。

c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: 找不到-lC:\rhino \data\lib\glfw.dll c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: 找不到-lC:\rhino\data\ lib\libglfwdll.a c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: 找不到-lC:\rhino\data\ lib\libglfw.a

C:\Users\rhino>dir C:\rhino\data\lib\libglfw.a
04/15/2011  05:24 PM            70,384 libglfw.a

更新:

我什至已将它们添加到我的 C:\MinGW\lib 路径中,但它仍然找不到它们。

【问题讨论】:

  • 确保已将库添加到 Eclipse 的库路径中。
  • -L"C:\rhino\data\libs" -L"C:\rhino\data\lib"
  • ld 命令行是什么?
  • 没有,是 gcc:
  • gcc -LC:\rhino\data\libs -LC:\rhino\data\lib -oTestC.exe TestC.o -lglfw.dll -llibglfw.a -llibglfwdll.a ### 他们在这个目录下:C:\rhino\data\lib

标签: c gcc mingw


【解决方案1】:

试试这个:

gcc -LC:\rhino\data\libs -LC:\rhino\data\lib -oTestC.exe TestC.o -lglfw libglfw.a libglfwdll.a

【讨论】:

  • C:\rhino\EProjects\TestC\Debug>gcc -LC:\MinGW\lib -oTestC.exe TestC.o -lglfw libglfw.a libglfwdll.a gcc: libglfw.a: 没有文件或目录 gcc: libglfwdll.a: 没有这个文件或目录 C:\rhino\EProjects\TestC\Debug>gcc -LC:\MinGW\lib -oTestC.exe TestC.o -lglfw libglfw libglfwdll gcc: libglfw: 没有这个文件或目录 gcc: libglfwdll: 没有这样的文件或目录 C:\rhino\EProjects\TestC\Debug>gcc -LC:\MinGW\lib -oTestC.exe TestC.o -lglfw -llibglfw.a libglfwdll.a gcc: libglfwdll .a: 没有这样的文件或目录
  • C:\rhino\EProjects\TestC\Debug>gcc -LC:\MinGW\lib -oTestC.exe TestC.o -lglfw -llibglfw.a -llibglfwdll.ac:/mingw/bin/ ../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe:找不到-llibglfw.ac:/mingw/bin/../lib/ gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe:找不到-llibglfwdll.a collect2:ld返回1个退出状态
  • c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe:无法finC :\rhino\EProjects\TestC\Debug>gcc -LC:\MinGW\lib -oTestC.exe TestC.o -lglfw -llibglfw -llibglfwdll c:/mingw/bin/../lib/gcc/mingw32/4.5.2 /../../../../mingw32/bin/ld.exe:找不到-llibglfw c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../.. /../../mingw32/bin/ld.exe:找不到-llibglfwdll collect2:ld返回1退出状态d-llibglfw.ac:/mingw/bin/../lib/gcc/mingw32/4.5.2/。 ./../../../mingw32/bin/ld.exe:找不到-llibglfwdll collect2:ld返回1退出状态
【解决方案2】:

我的经验(不包括在 Eclipse 中如何配置)是 ld(gcc 将调用)想要不带 lib 前缀或 .a 扩展名的库名称。试试:

gcc -LC:\rhino\data\libs -LC:\rhino\data\lib -oTestC.exe TestC.o -lglfw -lglfwdll

我不确定glfw.dll 文件是否应该被列为库;该 DLL 的导入库(我假设是 libglfwdll.lib)应该负责链接到 DLL。

【讨论】:

  • 您也可以在最新版本的 GCC 中链接到 dll。您还需要将 DLL 路径添加到 -L 选项。
  • @rubenvb:很有趣——我不知道。现在的问题是:为什么 MSVC 的链接器不让你这样做,为什么要花这么长时间?
  • 好吧,你可以通过LoadLibrary 和相关的混乱。至于什么花了这么长时间;我不知道它是什么时候实施的,但它似乎是在 2007 年之前/左右查看旧论坛帖子...
【解决方案3】:

Michael Burr 指出了在命令行中引用库的正确方法。库的路径用-L 开关给出,库的名称用-l 开关给出(库的名称是文件名,开头没有lib 部分,@ 987654324@结尾)。

还有一点需要指出的是,您正在尝试同时链接到库的静态 (libglfw.a) 和动态 (glfw.dll) 版本,这两个版本都包含在下载中时间。相反,您应该根据自己的需要/愿望选择一个,并且只链接到那个。

链接到静态版本很简单。只需将-lglfw 添加到命令行即可。

要使用动态库,您应该使用-lglfwdll 开关链接到 dll (libglfwdll.a) 的导入库,并在链接命令中省略 dll 本身。基本上,导入库不包含任何目标代码,而只包含定义;实际代码在 dll 中。 dll 将在运行时动态链接。 (为此,系统必须能够找到 dll;即,它必须在当前工作目录中,在路径中的目录中,或者必须将其目录添加到使用的特殊环境变量中对于这个东西;但要让它变得重要,你首先必须成功构建可执行文件。)

【讨论】:

    【解决方案4】:

    虽然这个问题很老了,但我从最近的一个问题中遇到了这个问题,解决方案与上面的完全不同,所以分享一下。

    在我的例子中,由于 shell $PATH 顺序 (echo $PATH),gcc 正在使用 anaconda 安装中的 ld,而这个 ld 找不到特定的库。

    只需更改路径顺序即可解决:

    export PATH=/usr/bin:$PATH
    

    没有有害影响,见here

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 2012-03-21
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多