我有一个名为 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 ...
但没有什么能成功链接。
我的问题是这是否可行?如果是的话,怎么做?如果不是,为什么不呢?
(提前致谢。)
答案 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;失败。