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

时间:2016-04-09 17:58:09

标签: c gcc linker static-linking dynamic-linking

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

我有一个名为 A.DLL 动态库,它正确编译和链接并生成 LIBA.A

现在,我有另一个名为 LIBB.A 静态库,其函数定义使用 A.DLL afunc() >。这也会正确编译和链接,并生成 LIBB.A

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

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

我尝试过以下几种方式:

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

但没有什么能成功链接。

我的问题是这是否可行?如果是的话,怎么做?如果不是,为什么不呢?

(提前致谢。)

1 个答案:

答案 0 :(得分:1)

以下是您尝试做的人的一个示例:

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

交流转换器:

#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");
}

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

这适合我。

编辑:重要提示 - -l标志的顺序非常重要。使用LDFLAGS=-L. -la -lb构建&#34; stackoverflow.exe&#34;失败。