如何静态地 link 一个库,而动态地 link 另一个库?
How to statically link a library which links dynamically another library?
我在使用GCC时出现如下情况:
我有一个名为 A.DLL 的 dynamic 库,它可以正确编译和 links 并生成 LIBA.A.
现在,我有另一个名为 LIBB.A 的 static 库,它有一个使用 afunc()
的函数定义来自 A.DLL。这也可以正确编译和 links 并生成 LIBB.A.
但是当我在另一个程序中使用LIBB.A时PROGC.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" 失败。
我在使用GCC时出现如下情况:
我有一个名为 A.DLL 的 dynamic 库,它可以正确编译和 links 并生成 LIBA.A.
现在,我有另一个名为 LIBB.A 的 static 库,它有一个使用 afunc()
的函数定义来自 A.DLL。这也可以正确编译和 links 并生成 LIBB.A.
但是当我在另一个程序中使用LIBB.A时PROGC.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" 失败。