我有一个Fortran程序,它调用C包装函数,而C包装函数调用由软件供应商提供的实际C函数.我编译了我的C包装器:

gcc -c -o mylib.o -I/home/me/vendor/src -L/home/me/vendor/x64 wrapper.c -l:vendor.a

Vendor/src包含一个头.h文件,该文件包含在我的C包装器中.Vendor/x64包含vendor.a,其中包含供应商的*.o函数.此编译没有错误,并创建了mylib.o. 但是,当我try 编译我的Fortran程序时,我得到了对供应商函数错误的未定义引用:

ifort client.f90 main.f90 -L/home/me/wrapper_lib -l:mylib.o

除非我再次链接供应商.a:

ifort client.f90 main.f90 -L/home/me/wrapper_lib -l:mylib.o -L/home/me/vendor/x64 -l:vendor.a

这与我在Windows上的Visual Studio项目中的工作方式不同,在该项目中,我能够编译链接到供应商库的静态库(mylib.lib),并且在编译我的主程序时,我可以简单地链接到mylib.lib.有没有办法和GCC一起完成同样的事情?

推荐答案

你想要的是"部分链接".

您可以使用-r来完成此操作,而不是初始命令中的-c.

它产生一个可重定位的.o作为输出,但(与-c不同)does链接它可以解析的事物(即vendor.a)


给定以下.c个文件:

==> ifort.c <==
void wrapa(void);

int
main(void)
{
    wrapa();
    return 0;
}

==> venda.c <==
void
venda(void)
{
}

==> vendb.c <==
void
vendb(void)
{
}

==> wrapper.c <==
void venda(void);
void
wrapa(void)
{
    venda();
}

void vendb(void);
void
wrapb(void)
{
    vendb();
}

以下是构建命令文件:

gcc -c venda.c
gcc -c vendb.c
ar crv vend.a venda.o vendb.o

gcc -c wrapper.c
ld -r -o mylib.o wrapper.o -L. -l:vend.a

gcc -o ifort ifort.c mylib.o

nm -go *.o

以下是sh -x个构建版本的输出:

+ gcc -c venda.c
+ gcc -c vendb.c
+ ar crv vend.a venda.o vendb.o
r - venda.o
r - vendb.o
+ gcc -c wrapper.c
+ ld -r -o mylib.o wrapper.o -L. -l:vend.a
+ gcc -o ifort ifort.c mylib.o
+ nm -go mylib.o venda.o vendb.o wrap.o wrapper.o
mylib.o:0000000000000018 T venda
mylib.o:000000000000001f T vendb
mylib.o:0000000000000000 T wrapa
mylib.o:000000000000000c T wrapb
venda.o:0000000000000000 T venda
vendb.o:0000000000000000 T vendb
wrap.o:                 U venda
wrap.o:                 U vendb
wrap.o:0000000000000000 T wrapa
wrap.o:000000000000000c T wrapb
wrapper.o:                 U venda
wrapper.o:                 U vendb
wrapper.o:0000000000000000 T wrapa
wrapper.o:000000000000000c T wrapb

C++相关问答推荐

由于未签名int导致的运行时错误"

如何在C中通过转换为char * 来访问float的字节表示?

#If指令中未定义宏?

每个 struct 变量在C中都有自己的命名空间吗?

C-使用指针返回修改后的整数数组

为什么中断函数会以这种方式影响数组?

为什么我的Hello World EFI程序构建不正确?

试图创建一个基本的Word克隆,但遇到了障碍

C中的回文数字

对于STM32微控制器,全局偏移表.get和.Got.plt必须为零初始化

将非连续物理内存映射到用户空间

C23标准是否向后兼容?

为什么会出现此错误?二进制表达式的操作数无效

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

在C中打印指针本身

不兼容的整数到指针转换传递';char';到类型';常量字符*

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

const struct 成员的 typedef 中的灵活数组大小

变量的指针右对齐,函数的指针左对齐