一个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
    
    

    使用方式是:

    1. 初始化配置:
    sh hlink.sh casename
    
    1. 放入自己的代码:
    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
    
    1. 大家加油!
      另外: 如果脚本不好使不要投诉我了. 反正我一不是组委会的人, 二不是超算的技术支持, 所以投诉我是没有用的.


  • @石器时代 棒,帮助解决问题只是兴趣不是义务。。。。



  • 另外给一个栗子吧:
    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选项?


登录后回复