如何静态地 link 一个库,而动态地 link 另一个库?

How to statically link a library which links dynamically another library?

我在使用GCC时出现如下情况:

我有一个名为 A.DLLdynamic 库,它可以正确编译和 links 并生成 LIBA.A.

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

但是当我在另一个程序中使用LIBB.APROGC.C编译成可执行程序PROGC.EXE, GCC 不能 link 到 A.DLL 使用 LIBA.A.

它给出了错误:undefined reference to afunc()

我尝试执行以下操作:

 gcc PROGC.C -o PROGC.EXE -lLIBB.A -Wl,-Bdynamic -lLIBA.A ...

但是 link 没有任何效果。

我的问题是这是否可能?如果是,该怎么做?如果不是,为什么不是?

(提前致谢。)

这里是一个你想做的例子:

a.h:

#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

a.c:

#define BUILD_A_DLL

#include "a.h"

#include <stdio.h>

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

b.h:

#ifndef B_H
#define B_H

extern void print_b_version();

#endif

b.c:

#include "b.h"

#include <stdio.h>

#include "a.h"

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

Whosebug.c:

#include "b.h"

int main()
{
    print_b_version();

    return 0;
}

makefile(适用于 mingw-64):

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 Whosebug.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

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

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

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

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

.PHONY:all clean mrproper

这对我有用。

编辑:重要说明 - -l 标志的顺序非常重要。使用 LDFLAGS=-L. -la -lb 构建 "Whosebug.exe" 失败。