一个Ugly的针对CMake加入外部库的方式
-
鉴于前一阵子貌似大家已经因为编译和链入外部库的事情吵了起来.
我写了一个简单的脚本用来生成链入外部库的配置.mkdir $1 cd $1 cat > compile.sh <<EOF make -C cpelib -B && make -j 4 EOF mkdir cpelib cd cpelib cat > Makefile <<EOF CPE_SRCS=\$(wildcard *_cpe.c) MPE_SRCS=\$(wildcard *_mpe.c) CPE_OBJS=\$(patsubst %.c, %.o, \$(CPE_SRCS)) MPE_OBJS=\$(patsubst %.c, %.o, \$(MPE_SRCS)) OBJS=\$(CPE_OBJS) \$(MPE_OBJS) all: libmdrun-sw.a libmdrun-sw.a: \$(OBJS) -rm \$@ sw5ar cr \$@ \$(OBJS) \$(CPE_OBJS): %_cpe.o: %_cpe.c sw5cc -slave -c -msimd \$< -o \$@ \$(MPE_OBJS): %_mpe.o: %_mpe.c sw5cc -host -c -msimd \$< -o \$@ EOF make cd .. CC=mpicc CXX=mpiCC LDFLAGS="-Wl,--whole-archive,`readlink -f cpelib`/libmdrun-sw.a,--no-whole-archive" cmake .. -DGMX_FFT_LIBRARY=fftpack -DGMX_MPI=on -DGMX_DOUBLE=ON -DGMX_BUILD_MDRUN_ONLY=ON -DBUILD_SHARED_LIBS=off -LH
使用方式是:
- 初始化配置:
sh hlink.sh casename
- 放入自己的代码:
cp your_cpe_source_cpe.c casename cp your_mpe_source_mpe.c casename
这里的从核代码必须以_cpe.c结尾而主核代码为_mpe.c, make会自动根据这些文件进行wildcard并进行编译.
熟悉makefile的小朋友可以加一点自动依赖分析 (声明: 这个脚本生成的Makefile不带自动依赖分析所以我在compile.sh里面加入了-B).
3. 编译:cd casename sh compile.sh
- 大家加油!
另外: 如果脚本不好使不要投诉我了. 反正我一不是组委会的人, 二不是超算的技术支持, 所以投诉我是没有用的.
-
@石器时代 棒,帮助解决问题只是兴趣不是义务。。。。
-
另外给一个栗子吧:
test_cpe.c
#include <stdio.h> #include <slave.h> int cpe_hello(){ if (!_MYID) puts("Hahaha"); }
test_mpe.c
#include <athread.h> extern slave_cpe_hello(); void cpe_call(){ athread_init(); athread_spawn(cpe_hello, 0); athread_join(); }
gromacs-5.1.5/src/programs/mdrun_main.cpp
........ extern "C"{ void cpe_call(); } int main(int argc, char *argv[]) { cpe_call(); return gmx::CommandLineModuleManager::runAsMainCMain(argc, argv, &gmx_mdrun); }
注意extern C.
-
您好!非常感谢您的分享~ 不过在实际操作中遇到了问题想请教一下:
我用sw5cc -slave -c和sw5cc -host -c生成了.o文件,后用sw5ar cr生成了.a文件
其中从核的代码中调用了math.h中的exp
在链接时用了下面的命令:
mpicc p.o -Wl,--whole-archive,/home/export/online1/cpc051/zhaocg/sw_build/libmdrun-sw.a,--no-whole-archive
然后报错:undefined reference to `slave_exp'
在最后链接中加上-lm也还是这个错误希望大神可以协助!O(∩_∩)O谢谢
-
@LyricZ 从核的数学函数库默认-lm_slave
-
@LyricZ /usr/sw-mpp/swcc/sw5gcc-binary/lib/ldm_math 这里是从核上比较快速的版本的部分基础数学函数实现,但是需要一直占用一定的ldm空间,多给你一个选择
-
非常感谢!已解决!
-
如果主核代码在一个头文件里,而且从核代码包含头文件的情况下怎么加入外部库呢?
-
@小学生 用编译器的-I选项?