使用gcc静态链接Mac上的cilk库

时间:2013-08-14 12:02:36

标签: c macos gcc static-linking cilk

我正在尝试将cilk库静态链接到我的程序,以便能够在没有安装cilk库的环境中运行可执行文件(因为它不常见)。

这是我能想到的最好的:

cilkc -Ofast -Wextra -pedantic -fwhole-program -flto -msse4.2 -m64 -lm -mtune=generic -funroll-loops -finline-functions -ffast-math -lpthread -lz -DUSE_GCC -Wc,-std=c99 -Wc,-pipe -DUSE_FILE32API /usr/local/lib/libcilk.a /usr/local/lib/cilk/libcilkrt0.a src/all.c src/CilkSearch.cilk

如上所述,我手动链接libcilk.a和libcilkrt0.a以防止gcc链接到共享库。这使得程序大小从266Kb增加到344Kb,这让我觉得静态链接成功了。

可悲的是,当我用otool检查我的可执行文件的依赖项时,我得到:

bin/hayabusa:
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
/usr/local/lib/libcilk.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/opt/local/lib/gcc47/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

我理解zlib和gcc,我还没有静态链接。 但是,如果我手动链接到libcilk.a,为什么libcilk.0.dylib依赖仍然存在?

我实际上也尝试在另一台计算机上运行该程序,但在启动时程序终止抱怨无法加载/usr/local/lib/libcilk.0.dylib。

所以我的问题是,明确指定.a到gcc是不足以删除指定的库依赖项?还有什么办法让我的libcilk静态链接而不是在运行时加载?

我已经知道-static选项,但我不希望每个包含系统库的库都静态链接,我只希望cilk库静态链接。
这有可能吗?

1 个答案:

答案 0 :(得分:0)

我们明确不支持将Cilk运行时链接为静态库。我们在http://www.cilkplus.org/faq/there-version-intel-cilk-plus-provides-statically-linked-libraries的常见问题解答中解释了原因。我知道你正在构建一个应用程序,而不是一个库。但是如果你将你的应用程序与其他同时使用Cilk Plus的库连接起来,你就会冒着线程组合爆炸的风险,这可能会影响性能。

这并不是说它无法完成。但是如果遇到任何问题,必须先用动态链接的运行时重现它们,然后再考虑它们。

- Barry Tannenbaum
  Intel Cilk Plus Runtime Developer