c - 如何编译需要其他dll的dll

标签 c dll makefile linker cross-compiling

我正在尝试交叉编译我正在做的一个软件。 我在 Linux 上,尝试编写 Makefile 来使用 SDL2 编译 DLL 库时遇到了相当大的困难。这是它:

#the compiler
CC = i686-w64-mingw32-gcc

#the standart ompilation flags of the project
CFLAGS = -O3 -Wall -Wno-unused-variable -Wno-unused-but-set-variable -Wno-implicit-function-declaration

#path to the folder's root, where the holy not build framework is. Relate to this Makefile
PREPATH = ..

#Path to the SDL, SDL_image and Lua includes and libs
SDL2INCLUDES = -I $(PREPATH)/SDL2/include
SDL2LIBS = $(PREPATH)/BINARIES/4windows/SDL2/64/SDL2.dll
SDLIMAGE2INCLUDES = -I $(PREPATH)/SDL2/SDL_image
SDLIMAGE2LIBS = $(PREPATH)/BINARIES/4windows/SDL2_image/64/SDL2_image.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/libjpeg-9.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/libpng16-16.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/libtiff-5.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/libwebp-4.dll $(PREPATH)/BINARIES/4windows/SDL2_image/64/zlib1.dll
#LUAINCLUDES = -I $(PREPATH)/lua/
#LUALIB = $(PREPATH)/lua/ -llua -lm

#Where to put the compiled program
COMPILEPATH = $(PREPATH)/BINARIES/



#Build options

build: NLF.o
    cp ./*.o $(COMPILEPATH)
    $(CC) $(CFLAGS) -shared -o $(COMPILEPATH)libNLF.dll $(SDL2LIBS) $(SDLIMAGE2LIBS) $(COMPILEPATH)*.o

NLF.o: NLF_osservice.o NLF_error.o NLF_screen.o NLF.h.gch
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF.c
NLF.h.gch: NLF.h
    $(CC) $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF.h

NLF_osservice.o: NLF_osservice.h.gch
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) NLF_osservice.c
NLF_osservice.h.gch:
    $(CC) $(CFLAGS) $(SDL2INCLUDES) NLF_osservice.h

NLF_error.o: NLF_error.h.gch
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) NLF_error.c
NLF_error.h.gch:
    $(CC) $(CFLAGS) $(SDL2INCLUDES) NLF_error.h

NLF_screen.o: NLF_screen.h.gch
    $(CC) -c -DBUILD_DLL $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF_screen.c
NLF_screen.h.gch:
    $(CC) $(CFLAGS) $(SDL2INCLUDES) $(SDLIMAGE2INCLUDES) NLF_screen.h



#cleaning options

clean-build:
    rm -f -v $(COMPILEPATH)*.o

clean-all:
    rm -f -v ./*.o ./*.h.gch
    rm -f -v $(COMPILEPATH)*.o $(COMPILEPATH)*.so

clean-soft:
    rm -f -v ./*.o ./*.h.gch
    rm -f -v $(COMPILEPATH)*.o

当运行 make all 时,编译运行良好,但是当它到达 -shared 部分时,我得到:

../BINARIES/4windows/SDL2/64/SDL2.dll: file not recognized:

我尝试在第三方 DLL 之前添加 -L,如下所示:

SDL2LIBS = -L $(PREPATH)/BINARIES/4windows/SDL2/64/SDL2.dll
SDLIMAGE2LIBS = -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/SDL2_image.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/libjpeg-9.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/libpng16-16.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/libtiff-5.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/libwebp-4.dll -L $(PREPATH)/BINARIES/4windows/SDL2_image/64/zlib1.dll

然后我收到 undefined reference 错误... 如果我更改行,也会出现同样的错误:

$(CC) $(CFLAGS) -shared -o $(COMPILEPATH)libNLF.dll $(SDL2LIBS) $(SDLIMAGE2LIBS) $(COMPILEPATH)*.o

对于

$(CC) $(CFLAGS) $(SDL2LIBS) $(SDLIMAGE2LIBS) -shared -o $(COMPILEPATH)libNLF.dll $(COMPILEPATH)*.o

有谁知道这是怎么回事吗?

最佳答案

您不应在库文件之前使用 -L。 -L 表示库路径。对于库文件,您应该使用-l(小写L)。 但是,如果您指示文件的路径并包含文件扩展名,则不需要使用 -l。所以从这个意义上来说,最初的 Makefile 是正确的。

您应该提供您收到的完整错误,而不是 just file not recognized: 。我打赌这是一个file format not recognized错误,这可能表明您不应链接 .dll 文件,而应链接 .lib 文件。 Similar problem here .

关于c - 如何编译需要其他dll的dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37505178/

相关文章:

c++ - 覆盖来自 kernel32 的调用

c++ - Apache Ignite 编译 ODBC 驱动错误

makefile - CMake:指定构建工具链

c++ - 如何通过反汇编从 C++ 函数中获取 "lea"指令?

c - 如何对C中输出的正确名称排序列表进行排序?

c++ - 未使用 GetProcAddress() C++ VBexpress 13 查找函数

c - undefined reference 而不是 makefile

c - 使用字符串查找数字平均值

c - 有没有办法写得更简洁?

python - Python 包装器中的 Fortran DLL,相同功能的输出不同