我正在尝试链接到OS X上的静态库.我-static在gcc命令中使用了该标志,但是我收到以下错误消息:
ld_classic: can't locate file for: -lcrt0.o collect2: ld returned 1 exit status
我查看了手册页,它的内容如下:
除非所有库(包括libgcc.a)都已使用-static编译,否则此选项在Mac OS X上不起作用.由于既没有提供libSystem.dylib的静态版本也没有提供crt0.o,因此该选项对大多数人没用.
有没有其他方法可以链接到这个静态库?
如何生成用Rust编写的编译成LLVM-IR bitcode的应用程序的可执行文件?
如果我尝试使用rustc编译.bc文件,它告诉我stream did not contain valid UTF-8,我似乎无法弄清楚是否在rustc中有特定选项.
基本上我想实现这个目标:
program.rs- > program.bc- > program.program最终的可执行文件在哪里.我应该采取什么措施来实现这一目标?
我想为Darwin创建一个静态可执行文件,用于一个我编写的名为difftodo的小型实用程序。difftodo间接取决于pcre,我希望人们能够下载二进制文件并运行它而不必先执行brew install pcre。
如果我不使用选项进行编译,则会得到一个可动态链接pcre的二进制文件:
$ otool -L /Users/jml/src/difftodo/.stack-work/install/x86_64-osx/lts-7.1/8.0.1/bin/git-todo
/Users/jml/src/difftodo/.stack-work/install/x86_64-osx/lts-7.1/8.0.1/bin/git-todo:
/usr/local/opt/pcre/lib/libpcre.1.dylib (compatibility version 4.0.0, current version 4.7.0)
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
Run Code Online (Sandbox Code Playgroud)
按照https://github.com/commercialhaskell/stack/issues/1032上的说明,我尝试了以下操作:
$ stack build --ghc-options -static --ghc-options -optl-static
difftodo-0.2.0: configure
Configuring difftodo-0.2.0...
difftodo-0.2.0: build
Preprocessing library difftodo-0.2.0...
ld: illegal text reloc in '_c1TGM_info' to '_stg_sel_1_upd_info' for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
`gcc' failed …Run Code Online (Sandbox Code Playgroud) 我正在使用callgrind. 这是我第一次这样做。我发现最高级别的函数(我认为是负责启动程序运行的函数)被称为_dyld_start. 我想知道这到底是什么。
另外,在我的一些需要很长时间运行的程序上,我的main()函数占用了 ; 调用的所有函数的大约 99% 的时间_dyld_start;然而,在我的程序中,运行时间较短(大约半秒),我发现main()只花费了大约 85% 的_dyld_start时间,其余的时间都会dyldbootstrap::start()。我假设这是一个与启动 C++ 程序相关的函数。它占用 85% 的_dyld_start运行时间是否合理?
我正在使用 C++11 标准编译我的代码。我正在我的 OS/X 上编译,所以我使用clang. 我的valgrind版本是3.10.0。
libpython2.7我正在尝试与on建立静态链接Mac OS X 10.11。
虽然静态链接可以成功地与libpython2.7.ain 一起使用pyenv(anaconda)-build python,但它不能与libpython2.7.ain 一起使用Framework-build python。
由于该-static选项似乎不适用于 Mac OS X,因此我尝试了以下方法。
CXXFLAGS=-I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
LIBS=/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.a
$ g++ -o main main.cc $(CXXFLAGS) $(LIBS)
Run Code Online (Sandbox Code Playgroud)
并得到以下结果。
$ otool -L main
main:
/System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.10)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
Run Code Online (Sandbox Code Playgroud)
与 的链接libpython2.7.a导致与 的动态链接Versions/2.7/Python。
我还发现 和libpython2.7.a都是libpython2.7.dylib到 …
我想构建一个可移植的静态 C 库,无论 macOS 版本如何,都可以链接到 macOS 二进制文件。C 库没有任何依赖项(即没有 stdlib,没有特定于操作系统的调用)。唯一的依赖是 CPU,它必须是 x86_64。
当提取相关的编译器三元组时,我得到x86_64-apple-darwin16.7.0了 Sierra 和x86_64-apple-darwin17.2.0High Sierra。另外,当我在 High Sierra 上构建时,如果我使用 Sierra 的静态库(即使我指定--target x86_64-apple-darwin16.7.0为 clang),则会出现警告。
如何为 macOS 构建真正可移植的静态库?如果不可能的话,有什么办法呢?每个主要 macOS 版本都有一个从同一版本构建的不同版本?是否存在从过时的 Xcode 版本中复制 SDK 的黑客行为?请记住,我的库是完全可移植的,并且不以任何方式依赖于 macOS 或 stdlib。
编译器三元组末尾的版本部分重要吗?