C 如何静态链接一个动态链接另一个库的库?

C 如何静态链接一个动态链接另一个库的库?,c,gcc,linker,static-linking,dynamic-linking,C,Gcc,Linker,Static Linking,Dynamic Linking,我在使用GCC时遇到以下情况: 我有一个名为a.DLL的dynamic库,它可以正确编译和链接,并生成LIBA.a 现在,我有另一个名为LIBB.A的static库,它的函数定义使用A.DLL中的afunc()。这还可以正确编译和链接,并生成LIBB.A 但是,当我在另一个程序PROGC.C中使用LIBB.A编译到可执行程序PROGC.EXE时,GCC无法使用LIBA.A链接到A.DLL 它给出错误:未定义对afunc()的引用。 我试着做了以下几点: gcc PROGC.C -o PROG

我在使用GCC时遇到以下情况:

我有一个名为a.DLL的dynamic库,它可以正确编译和链接,并生成LIBA.a

现在,我有另一个名为LIBB.Astatic库,它的函数定义使用A.DLL中的
afunc()
。这还可以正确编译和链接,并生成LIBB.A

但是,当我在另一个程序PROGC.C中使用LIBB.A编译到可执行程序PROGC.EXE时,GCC无法使用LIBA.A链接到A.DLL

它给出错误:
未定义对afunc()的引用。

我试着做了以下几点:

 gcc PROGC.C -o PROGC.EXE -lLIBB.A -Wl,-Bdynamic -lLIBA.A ...
但没有任何东西能成功链接

我的问题是这是否可能?如果是,怎么做?若否,原因为何


(提前感谢。)

下面是一个例子,告诉你该做什么:

a、 h:

a、 c:

b、 c:

makefile(用于mingw-64):

这对我有用


编辑:重要注意事项-
-l
标志的顺序非常重要。使用
LDFLAGS=-L.-la-lb
生成“stackoverflow.exe”失败。

可能您没有使用相同的调用约定!!!您是如何构建libb.a的?@jdarthenay我正在使用以下方法构建libb.a:
gcc.exe-cb.c-ob.o
ar.exe-r-s LIBB.A B.o
。然而,正如@milevyo所问的,我没有在任何库中使用任何显式调用约定。这是个问题吗?另外,我正在使用相同的编译器构建所有内容。您是否成功地仅将程序链接到.dll?(没有libb)。是的!在我的例子中,另一个类似的例子是A.dll是预编译的opengl32.dll和libb.A是一个静态库,它有一个使用
opengl draw functions
的函数定义,只有当我使用libb.A中的特定函数时,我才得到相同的链接错误。但我总是能够动态链接opengl32。我发现我的错误在于链接的顺序,因为还有其他库。
#ifndef A_H
#define A_H

#ifdef BUILD_A_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C"
{
#endif

extern EXPORT void __cdecl print_a_version();

#ifdef __cplusplus
}
#endif

#endif
#define BUILD_A_DLL

#include "a.h"

#include <stdio.h>

EXPORT void __cdecl print_a_version()
{
    printf("A: v1.0\n");
}
#ifndef B_H
#define B_H

extern void print_b_version();

#endif
#include "b.h"

#include <stdio.h>

#include "a.h"

void print_b_version()
{
    print_a_version();
    printf("B: v1.0\n");
}
#include "b.h"

int main()
{
    print_b_version();

    return 0;
}
CC=GCC
AR=ar
WINVER=0x0400
CFLAGS=-Wformat -std=gnu99 -Wall -Werror -DWINVER=$(WINVER) -std=gnu99
LDFLAGSDLL=-shared -Wl,--out-implib,liba.a
LDFLAGS=-L. -lb -la

all:a.dll libb.a stackoverflow.exe

a.dll:a.o
    $(CC) $(CFLAGS) -o a.dll a.o $(LDFLAGSDLL)

a.o:a.c a.h
    $(CC) $(CFLAGS) -c a.c

libb.a:b.o
    $(AR) -rs libb.a b.o

b.o:b.c b.h a.h
    $(CC) $(CFLAGS) -c b.c

stackoverflow.exe:stackoverflow.o libb.a
    $(CC) $(CFLAGS) -o stackoverflow.exe stackoverflow.o $(LDFLAGS)

stackoverflow.o:stackoverflow.c b.h
    $(CC) $(CFLAGS) -c stackoverflow.c

mrproper:clean
    for %%i in (a.dll liba.dll libb.o stackoverflow.exe) do if exist %%i del %%i

clean:
    for %%i in (a.o b.o stackoverflow.o) do if exist %%i del %%i

.PHONY:all clean mrproper