- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要构建一些 C 代码,然后通过 FFI 引用该 C 代码。我想在 osx 的 ghci 内部使用我的绑定(bind)。我的一个限制是我不能只将 C 源代码交给 .cabal 文件中的 ghc。这是由于 ghc/cabal 的限制可能会在 ghc 的下一个版本中修复(但我希望我的代码现在可以在旧版本上工作)。看到这个bug for details .
该错误的要点是 C 代码需要使用一些 Objective-C 模块进行编译,而 ghc 将它们误解为链接器脚本。我已经尝试了很多事情,并且使用makefile自己构建文件是唯一有效的方法。真的,这不应该是一个问题,因为它应该与我决定使用我没有自己构建的外部 C 库一样。为了解决这个问题,让我们假设它是一个单独的 C 库,我可以使用不同的选项轻松地重建它。
如果我将 C 库构建为 .a,则 ghci 提示它无法打开 .dylib。我的第一个问题是:为什么 ghci 需要一个 .dylib 并且它真的使用它吗?
当我构建一个 dylib 时,我得到一个 segfault when loading the code into ghci .
请记住,这个绑定(bind)已经在其他平台上工作,包括 linux 和 windows,当我编译而不是使用 ghci 时,绑定(bind)在 osx 上工作正常。此问题特定于 osx/ghci 组合。
在上面的那个跟踪中,我正在使用 gdb,但无论我是否使用 gdb,它都会崩溃。我将其追踪到导致崩溃的行:
void _glfwClearWindowHints( void )
{
memset( &_glfwLibrary.hints, 0, sizeof( _glfwLibrary.hints ) );
}
_glfwLibrary
的提示结构是内存访问冲突。提示结构只是一堆整数。它非常平坦和简单,因此我认为问题出在我如何链接事物或 ghci 加载代码的方式上。
GCCFLAGS := $(shell ghc --info | ghc -e "fmap read getContents >>= \
putStrLn . unwords . read . Data.Maybe.fromJust . lookup \
\"Gcc Linker flags\"")
FRAMEWORK := -framework Cocoa -framework OpenGL
GLFW_FLAG := $(GCCFLAGS) -O2 -fno-common -Iglfw/include -Iglfw/lib \
-Iglfw/lib/cocoa $(CFLAGS)
all: $(BUILD_DIR)/static/libglfw.a $(BUILD_DIR)/dynamic/libglfw.dylib
$(BUILD_DIR)/dynamic/libglfw.dylib: $(OBJS)
$(CC) -dynamiclib -Wl,-single_module -compatibility_version 1 \
-current_version 1 \
$(GLFW_FLAG) -o $@ $(OBJS) $(GLFW_SRC) $(FRAMEWORK)
$(BUILD_DIR)/static/libglfw.a: $(OBJS)
ar -rcs $@ $(OBJS)
最佳答案
最初的问题
Should this work with ghci? If so, what am I doing wrong or how can I fix the crash?
➜ GLFW-b git:(master) ✗ ghci dist/build/Graphics/UI/GLFW.hs -Lbuild/dynam
ic -lglfw
GHCi, version 7.0.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Loading object (dynamic) glfw ... done
final link ... done
[1 of 1] Compiling Graphics.UI.GLFW ( dist/build/Graphics/UI/GLFW.hs, inte
rpreted )
Ok, modules loaded: Graphics.UI.GLFW.
*Graphics.UI.GLFW> initialize
True
glfw
使用您提供的库
Makefile
,并另外使用了您的
.cabal
要处理的文件
src/Graphics/UI/GLFW.hsc
并构建
dist/build/Graphics/UI/GLFW.hs
(即我之前运行过
cabal configure/build
)。
Can I just get by with the static .a version of the library with ghci?
compiler/ghci/Linker.lhs
是一本很好的读物,它将让您对 ghci 如何决定如何处理传递给它的命令行参数有一个高级的了解。此外,在浏览各种平台支持问题时,我发现
this documentation非常有用。
1113
的
compiler/ghci/Linker.hs
证明
ghci
当前要求由软件包系统构建静态文件(即命名为
HSlibname.a
)
locateOneObj :: [FilePath] -> String -> IO LibrarySpec
locateOneObj dirs lib
| not ("HS" `isPrefixOf` lib)
-- For non-Haskell libraries (e.g. gmp, iconv) we assume dynamic library
= assumeDll
| not isDynamicGhcLib
-- When the GHC package was not compiled as dynamic library
-- (=DYNAMIC not set), we search for .o libraries or, if they
-- don't exist, .a libraries.
= findObject `orElse` findArchive `orElse` assumeDll
402
行收集。在
reallyInitDynLinker
功能:
; classified_ld_inputs <- mapM classifyLdInput cmdline_ld_inputs
classifyLdInput
被定义在
classifyLdInput :: FilePath -> IO (Maybe LibrarySpec)
classifyLdInput f
| isObjectFilename f = return (Just (Object f))
| isDynLibFilename f = return (Just (DLLPath f))
| otherwise = do
hPutStrLn stderr ("Warning: ignoring unrecognised input `" ++ f ++ "'")
return Nothing
.cabal
包规范,您正在尝试构建
两个 冲突库:
Setup.hs
和 Makefile
中的规范构建,并根据 extra-libraries
和 extra-lib-dirs
指令链接)c-sources
和 frameworks
指令)。 include-dirs:
glfw/include
glfw/lib
- c-sources:
- glfw/lib/enable.c
- glfw/lib/fullscreen.c
- glfw/lib/glext.c
- glfw/lib/image.c
- glfw/lib/init.c
- glfw/lib/input.c
- glfw/lib/joystick.c
- glfw/lib/stream.c
- glfw/lib/tga.c
- glfw/lib/thread.c
- glfw/lib/time.c
- glfw/lib/window.c
+
+ if !os(darwin)
+ c-sources:
+ glfw/lib/enable.c
+ glfw/lib/fullscreen.c
+ glfw/lib/glext.c
+ glfw/lib/image.c
+ glfw/lib/init.c
+ glfw/lib/input.c
+ glfw/lib/joystick.c
+ glfw/lib/stream.c
+ glfw/lib/tga.c
+ glfw/lib/thread.c
+ glfw/lib/time.c
+ glfw/lib/window.c
if os(darwin)
- include-dirs:
- glfw/lib/cocoa
- frameworks:
- AGL
- Cocoa
- OpenGL
extra-libraries: glfw
- extra-lib-dirs: build/static build/dynamic
+ extra-lib-dirs: build/dynamic
➜ GLFW-b git:(master) ✗ ghci
GHCi, version 7.0.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> :m + Graphics.UI.GLFW
Prelude Graphics.UI.GLFW> initialize
Loading package GLFW-b-0.0.2.6 ... linking ... done.
True
Prelude Graphics.UI.GLFW>
关于macos - OSX,ghci,dylib,正确的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6323755/
我认为我弄乱了 libxml2.dylib、libz.dylib、libicucore.dylib 和 libc++.dylib 文件,然后 1. 在项目中显示为红色,2. 导致链接器错误。 并在与库
我正在研究 SDK,试图了解实际包含的内容。 我注意到 dylibs 有时会以多个版本发布,例如 ls /Applications/Xcode.app/Contents/Developer/Platf
我在评论中提出了这个问题,但这似乎是一个值得单独提问的问题。 我有一个项目在三个不同的 XCode 安装和两个不同的 iOS SDK 安装之间共享。目前,统一所涉及的开发人员不是一种选择。 当我安装
我正在多次加载 dylib 并尝试理解是什么让这些符号不同。 这是我的步骤: 使用以下入口点构建 lib_a.dylib: FactoryA : IFActory () {} extern "C" I
我正在关注 this tutorial 教程说明要添加 libz.1.2.3.dylib. 库,但是因为我下载了新的或旧的库(我不知道我的库是新的还是旧的教程中的库,但 99% 是较新的)。所以,当我
有没有办法使用 dylib 的路径查找其版本?我正在寻找接受与 dlopen 相同参数的东西。我查看了 NSVersionOfRunTimeLibrary,但从我阅读的文档来看,它似乎获取了当前 dy
我正在从源代码构建 cyrus sasl2 库。库安装在/usr/local/lib 中, header 安装在/usr/local/include/sasl 中,这是正确的。 但是,当我运行尝试使用
我确定 .A 意味着什么,但搜索它只会产生噪音。请赐教。 最佳答案 哦,它们是一样的。 -rwxr-xr-x 1 root wheel 4969408 Sep 25 16:06 libicuco
我已经从我的 iOS 应用项目构建了一个 ipa 包。使用 zip 打开 .ipa 文件后。我发现这里有很多 swift 支持的动态库。 我想知道 libswiftFoundation.dylib 和
在带有 gcc-5.2 的 g++ 的 mac os x 下,我正在尝试执行以下操作:创建一个 dylib,导出由 header tmp8bis_dylib.h 定义的类和来源 tmp8bis_dyl
我正在使用 py2app 从 Python 代码创建一个应用程序。 一切顺利,直到我运行 setup.py,然后在它运行的最后我收到这条消息:“ValueError: '/Users/(my_comp
我有一个旧的 iOS Xcode 项目,我在其中使用了 libxml2.dylib 和 libresolv.9.dylib。安装 XCode7 后。 我找不到文件,也不知道去哪里搜索。有人可以帮助我吗
我开始在我正在开发的应用程序中使用 SQLite 数据库。我还没有遇到问题,但是来自 this tutorial 的早期步骤之一正在链接 SQLite3 框架。本教程需要 libsqlite3.0.d
我正在为 Xamarin.Mac 创建绑定(bind)/MonoMac 。我想嵌入 dylib在生成的dll中就像 Xamarin.iOS 上所做的那样与 [LinkWith]属性。 可以这样做吗?如
C++ dylib 暴露如下 __attribute__((visibility("default"))) int addNumber(int number) { return 0; } 在我
目前我正在使用 libxml2.dylib 来解析 XML 现在我想转移到 libxml2.2.dylib。那么,我会在配置和编码方面做什么样的改变? 最佳答案 Xcode 4.5(和重要的 iOS6
在使用 matplotlib 时获取错误信息: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already ini
我已经创建了一个Python应用程序,并使用Pyinstaller将其构建到Unix可执行文件中。在我尝试对应用程序进行代码签名之前,应用程序运行得很好。在代码签名之后,我在尝试运行可执行文件时收到以
我正在尝试在应用程序上使用 Parse,我是 swift 的新手。但是我下载了 Xcode 7,似乎 libz.dylib libsqlite3.dylib 丢失了,当我编译和构建它时,它已成功完成,
我在尝试在任何脚本上使用 Pilow 时遇到此错误: File "/Users/antonio/WWW/myproj/myproj/functions.py", line 12, in
我是一名优秀的程序员,十分优秀!