我正在尝试将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库被静态链接
这可能吗?
我们明确不支持将Cilk运行时链接为静态库。原因的解释在我们的常见问题解答中http://www.cilkplus.org/faq/there-version-intel-cilk-plus-provides-statically-linked-libraries。我知道你在构建一个应用程序,而不是一个库。但是,如果您将应用程序与其他也使用Cilk Plus的库链接,则可能会出现线程组合爆炸,从而影响性能。
这并不是说不能做到。但是,如果遇到任何问题,在我们考虑这些问题之前,必须使用动态链接的运行时重新生成这些问题。
- Barry Tannenbaum
Intel Cilk Plus Runtime Developer