0

我正在尝试将 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 库被静态链接。
这可能吗?

4

1 回答 1

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
于 2013-08-15T03:21:04.283 回答