【问题标题】:USB GCC Development Environment with Libraries带库的 USB GCC 开发环境
【发布时间】:2011-09-02 18:25:33
【问题描述】:

我正在尝试在 USB 记忆棒上获得某种环境来开发 C++ 代码。我计划使用其他计算机(大多数情况下是 linux)从命令行使用 g++ 和 make 来处理这个问题。

问题是我需要使用一些计算机没有的库,例如 Lua 和 OpenGL。我无法将它们添加到普通目录,我在这些计算机上没有 root。我发现的大多数解决方案都涉及将东西放入 /usr/lib/ 等,但我不能这样做。我还尝试添加诸如'-L/media//lib'之类的选项,这是保存它们的地方,但它不起作用。编译时,我遇到了与第一次切换到未安装库的操作系统时相同的错误。

在 /usr/ 之外的计算机上是否有可以放置它们的地方,或者让 gcc '看到'它们的方法?

【问题讨论】:

  • -L/media/lib 怎么不起作用?
  • 当我这样做时,它给出了完全相同的错误,当我在我的计算机上编译时没有遇到这些错误,库在 /usr/lib/ 中。
  • 让我们再试一次 - 它怎么没用(示例/输出/错误消息/......)
  • 显示你的 makefile,你的 gcc 行,你的 USB 记忆棒的布局,....

标签: gcc linker g++ usb


【解决方案1】:

要使用这些库编译代码,您需要的不仅仅是库。 (我假设这里是 Linux,在 OSX、BSD、Cygwin、Mingw 等操作系统上可能会略有不同。)

对于开发,当您的代码使用库时,您需要以下 3 件事:

  • 库头文件,.h 文件
  • 库开发文件,通常是 libXXX.so 或 libXXX.a
  • 库运行时文件,libXXX.so.Y,其中 Y 是版本号。如果您在库中静态链接,则不需要这些。

您似乎缺少头文件 (?) 将它们添加到您的 U 盘中,例如在 /media/include 下

发展

  • 在编译源代码时使用(例如)编译器标志 -I/media/include 以引用头文件的非标准位置。
  • 使用编译器/链接器标志-L/media/lib 来引用库的非标准位置。

您可能错过了第一步。

跑步

对于动态链接的库,系统只会从默认位置加载那些,通常是 /lib/ , /usr/lib/

了解ldd 工具以帮助调试此步骤。

当你运行程序时,你需要告诉系统在哪里加载额外的库,这里有 3 种选择:

  • 系统范围:编辑 /etc/ld.so.conf 并在其中添加 /media/libs。之后运行ldconfig -a
  • 本地,仅限当前 shell。设置 LD_LIBRARY_PATH 环境变量以引用 /media/lib,运行export LD_LIBRARY_PATH=/media/lib
  • 可执行文件:硬编码可执行文件中的非标准库路径。在创建可执行文件时将其添加到链接步骤:-Wl,-rpath,/media/lib

可能还有其他原因,如果是这样的话, 向我们展示 ls -l /media/libs 的输出,以及您放置库头文件的位置、用于编译/链接的命令行以及您得到的确切错误。

  • 缺少头文件和/或开发库(对于动态库,通常有一个从 libXXX.so 到 libXXX.so.Y 的符号链接,链接器需要 libXXX.so ,它不会直接查看 libXXX.so .Y)
  • 使用与您当前的操作系统/架构不兼容的库。 (在一个 Linux 发行版上编译的库通常与另一个发行版不兼容,甚至与同一发行版的另一个次要版本不兼容)
  • 使用带有 FAT32 文件系统的 USB 记忆棒,您会遇到符号链接问题..

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多