【问题标题】:gcc Linking/Segfault issue on OS X 10.8OS X 10.8 上的 gcc 链接/段错误问题
【发布时间】:2013-02-04 01:41:32
【问题描述】:

所以关于发生了什么的一些背景故事。我目前正在构建许多东西(包括 SDL、SDL_image 等)并将它们全部链接到一个可执行文件中,然后手动完成。我正在制作自己的自定义 makefile,并且只使用命令行,而不是 Xcode。 (我不喜欢 Xcode)到目前为止,我已经成功地完成了这一切,但我想开始将 Lua 脚本放在我的代码之上,所以我现在正在编译 luajit2.0 并尝试将其链接。

然而,虽然 SDL 工作正常,我可以打开一个加载图像的窗口,但 luajit 拒绝正确链接。它给了我 dyld: Library not loaded... 消息,引用 /usr/local/lib 即使它不仅在那里不存在,而且 gcc 在命令行上被赋予 -L 到保存我构建的文件夹卢吉特。在我的二进制文件上使用 otool -L 会给出该目录,即使它甚至不存在于那里。

在尝试用谷歌搜索这个问题时,我遇到了一个解决方案,它给了我这个命令:install_name_tool -id `pwd`/install/lib/libluajit-5.1.dylib install/lib/libluajit-5.1.dylib。 (from SO) 重建二进制文件并在其上使用 otool 后,我现在看到了库的正确目录。然而,现在,虽然它没有给我 dyld 错误,但当我使用 luajit 函数时,它给了我一个段错误。 (特别是luaL_newstate)

构建我的二进制文件的命令如下:

gcc -g -Wall -arch x86_64 -framework Cocoa -Iinstall/include -Linstall/lib src/native/main.c -lluajit-5.1.2.0.0 -lSDL2_image -lSDL2 -lSDL2main -lpng -lz -o game

libluajit-5.1.2.0.0.dylib,所有对应的符号链接都在install/lib。 lua 包含文件在安装/包含中。这里出了什么问题?我很困惑,只想让它开始工作。我宁愿与代码搏斗,也不愿与 gcc 和 OS X 搏斗。

编辑:根据请求,我在当前“分段错误:11”错误之前得到的上一个错误基本上是这样的:

dyld: Library not loaded: /usr/local/lib/luajit-5.1.2.dylib
  Referenced from: <my application, forgot this exact bit>
  Reason: image not found

如果我做了 otool -L game 我得到了:

MacBook-Air:old freezerburn$ otool -L game
game:
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
    /usr/local/lib/libluajit-5.1.2.dylib (compatibility version 2.0.0, current version 2.0.0)
    /Users/freezerburn/Dropbox/Code/lua_engine/old/install/lib/libSDL2_image-1.2.0.dylib (compatibility version 9.0.0, current version 9.5.0)
    /Users/freezerburn/Dropbox/Code/lua_engine/old/install/lib/libSDL2-2.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
    /Users/freezerburn/Dropbox/Code/lua_engine/old/install/lib/libpng15.15.dylib (compatibility version 30.0.0, current version 30.0.0)
    /Users/freezerburn/Dropbox/Code/lua_engine/old/install/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.7)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

即使 libluajit 在 ./install/lib 中。

【问题讨论】:

  • 在询问错误消息时发布确切的错误消息总是明智的...
  • 我当前的错误消息是,字面意思是:分段错误:11。我认为说我有段错误就足够了。如果你愿意,我可以编辑它。

标签: macos gcc linker


【解决方案1】:

共享库有一个安装路径。这意味着您必须使用正确的 PREFIX 构建和安装,请参阅安装文档。或者考虑与静态 LuaJIT 库链接——从非系统位置加载动态库是一罐蠕虫。

段错误是由于没有遵循 OSX/x64 的 LuaJIT embedding instructions

【讨论】:

  • 呸,我觉得自己像个白痴。我以为我已经阅读了嵌入说明。对于这种确切类型的计算机,我完全错过了那个高度特定的位。非常感谢您指出这一点,Lua 现在正在工作,因为我在链接步骤中添加了该位:) 此外,我在构建时正确设置了 PREFIX,以及所有的库/包含/等。转储到 $(PROJECT)/install
【解决方案2】:

为什么不让自己的生活变得轻松并使用Macports

  1. 安装 macports
  2. $ xcode-select -switch /Applications/Xcode.app/Contents/Developer
  3. $ sudo port selfupdate
  4. $ sudo port install libsdl_image luajit

这将安装您请求的端口和任何依赖项。

然后,您可以专注于您的项目,并且知道合格的团队正在处理所有其他事情。

【讨论】:

  • 虽然我很欣赏这些建议(而且我确实知道 Macports 和自制软件),但这不是我现在想要做的。这最终旨在跨多个平台进行编译,而 Macports(显然)仅适用于 Mac :) 由于这个原因,我试图让整个构建完全独立
猜你喜欢
  • 2014-02-09
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多