我编写了一个小代码,我想用静态和动态库的组合进行编译。代码使用hdf5和exodusII(专业CAE lib)以及数学,当然还有好老的stdio。
为了使二进制文件具有高度可移植性,我想将hdf5和exodusII静态链接到代码中,但将math和libc保持为共享,以便在不同平台上优化代码。
我无法弄清楚正确的方法是编译这样的东西。我已经尝试过了: gcc -lm -lc -fPIC test1.c /usr/lib/libexodus.a /usr/lib/libhdf5.a -Wl,-pie 这给出了错误: /usr/lib64/crt1.o:在创建共享对象时,不能使用针对'__libc_csu_fini'的重定位R_X86_64_32S;用-fPIC重新编译 /usr/lib64/crt1.o:无法读取符号:错误值
我也尝试过: gcc -c test1.c(WORKS!) ld /usr/lib/libhdf5.a /usr/lib/libexodus.a -lm -lc test1.o 这给出了一个警告,即无法在test1.c中的libexodus函数中找到一个条目符号_start,后面跟着大量未定义的引用错误。 (我已经用nm检查了libexodus.a,并且报告的函数确实存在于存档中。
我真的很感激这一方面。我在使用静态库方面没有太多的经验,但对于这个应用程序,我认为它是最好的选择,只要我能够找到一种可靠的编译和链接方式。
三江源,
斯图
答案 0 :(得分:1)
错误在链接顺序中。我现在已经知道链接顺序就像babushka娃娃一样,依赖树顶部的库首先出现,最常用的库最后出现。
为了将来参考,最后,工作构建命令如下:
gcc test1.c -lexodus -lnetcdf -lhdf5_hl -hdf5 -lcurl -ldl -lm
我真正理解的是,当我将exodus库构建为共享库时,我只需链接共享库和依赖库(-lnetcdf -lhdf5_hl -lhdf5 -lcurl)未指明;但是,对于完全相同的库的静态编译,我现在需要明确地链接所有库。
如果有人对此行为有答案,那么对我的理解会有所帮助,并且非常感谢,但是由于我可以继续使用当前的构建方法进行编码,所以这不是一件紧急事情。
斯图