【问题标题】:manually link standard library in MinGW在 MinGW 中手动链接标准库
【发布时间】:2017-11-05 19:23:17
【问题描述】:

我在让 MinGW 识别 CSFML 库时遇到了一些麻烦。我不得不使用链接器手动链接每个库。现在我没有通过简单的 gcc 调用自动链接的标准库。

bbroo@DESKTOP-1F1J3SM ~/Shaders
$ ld shaders.o libcsfml-system.a libcsfml-window.a libcsfml-graphics.a csfml-system-2.dll csfml-window-2.dll csfml-graphics-2.dll
shaders.o:shaders.c:(.text+0x10): undefined reference to `__main'
shaders.o:shaders.c:(.text+0x4bc): undefined reference to `sleep'

MinGW 中标准库的名称是什么,如何在 LD 中链接到它?

我知道这并不能回答问题,但使用它进行编译:

gcc shaders.c libcsfml-system.a libcsfml-window.a libcsfml-graphics.a csfml-system-2.dll csfml-window-2.dll csfml-graphics-2.dll

【问题讨论】:

  • 编译时为什么不设置库搜索路径?我相信选项是-L
  • 我已经尝试了很多选项,但没有一个能走到这一步。
  • 使用gcc作为C程序的链接器

标签: c mingw ld


【解决方案1】:

使用 'ld' 并不明显。由于 gcc 成功编译了您的项目,您可以通过以下步骤直接使用 'ld' 重现链接阶段。

  1. 使用 'gcc' 编译并添加 -v 选项。这将产生大量文本,您可能希望将其重定向到带有 '2>out'
  2. 的文件
  3. 查找以“COLLECT_GCC_OPTIONS=”开头的最后一行
  4. 在此行之后会有一个 gcc 选项列表,用于规范“ld”的行为。从这一行中提取以下内容:两个 -L 选项,指向主库文件夹和 gcc 特定库文件夹;之后是一系列使用的目标模块和库。将这些复制到您的“ld”命令行。该列表相当大。 对象和库的顺序很重要!

这是成功链接简单测试程序的示例命令行:

ld -Lc:\MinGW\lib\gcc\mingw32\5.3.0 -Lc:\MinGW\lib -o test.exe crt2.o crtbegin.o test.o -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt crtend.o

您可能需要检查路径,将 *.o 文件复制到您的文件夹或添加路径并添加您的库。

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多