C 如何静态链接一个动态链接另一个库的库?
我在使用GCC时遇到以下情况: 我有一个名为a.DLL的dynamic库,它可以正确编译和链接,并生成LIBA.a 现在,我有另一个名为LIBB.A的static库,它的函数定义使用A.DLL中的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
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