如何用GCC编译包含第三方库的C库,让Fortran程序直接调用?
实现将依赖静态库合并到自定义静态库的方法
你当前的问题核心是:用gcc -c编译C包装器时,只是生成了单个目标文件mylib.o,并没有把供应商的vendor.a静态库合并进去。Linux下的静态库是目标文件的归档集合,默认不会自动递归合并依赖的静态库,所以需要手动完成合并步骤,才能达到Visual Studio中生成包含依赖的静态库的效果。
正确的操作步骤:
编译C包装器为目标文件
先单独编译wrapper.c,生成目标文件(这里命名为wrapper.o更清晰):gcc -c -o wrapper.o -I/home/me/vendor/src wrapper.c注意:原命令中的
-L和-l:vendor.a在编译阶段(-c参数)是无效的,因为编译阶段仅做语法检查和生成目标文件,不处理链接符号解析,所以这些参数可以去掉。合并目标文件与供应商静态库为新的静态库
使用ar工具将wrapper.o和vendor.a中的所有目标文件打包成一个新的静态库mylib.a:ar rcs mylib.a wrapper.o /home/me/vendor/x64/vendor.ar:替换或添加文件到归档c:创建归档(如果不存在)s:生成归档符号表
或者如果需要更精细的控制,可以先提取
vendor.a中的所有目标文件再合并:# 进入供应商库目录提取所有.o文件 cd /home/me/vendor/x64 ar x vendor.a # 回到包装器目录,合并wrapper.o和提取的.o文件 ar rcs /home/me/wrapper_lib/mylib.a /path/to/wrapper.o *.o编译Fortran程序时仅链接新静态库
现在只需要链接mylib.a即可,无需再指定vendor.a:ifort client.f90 main.f90 -L/home/me/wrapper_lib -lmylib
原理说明:
Visual Studio的静态库构建会自动将依赖的静态库内容合并到输出库中,但Linux下的ar工具默认不会自动递归合并依赖库,必须手动将所有需要的目标文件(包括自己的包装器代码和供应商库的代码)打包到同一个静态归档文件中,这样主程序链接时就能找到所有符号,无需再单独链接依赖库。
内容的提问来源于stack exchange,提问作者hunch_bot
相关产品推荐
相关产品推荐

