ld: undefined reference, 但它应该让他们未解决
ld: undefined reference, but it should leave them unresolved
我无法生成可与另一个库 (SDL) 配合使用的库。我正在使用 MinGW 进行制作,并使用 ld 到 link。我很困惑,因为 a) 它不应该在这些库中尝试 link,但稍后当有人 link 我的库也加入时再这样做; b) 即使我在 SDL 库中执行了 link,它仍然找不到 SDL 函数(SDL_GetTicks
、SDL_Delay
),它看起来是这样的——错误是相同的。另请注意,一些缺失的项目来自 std
.
这是错误。如您所见,我正在 ld 上尝试各种标志,使其不尝试解析引用,但 w/o 成功。
C:\Users\...\mcve>make
g++ -c -c -I../../../external/SDL2/include -I../include -o mcve.o mcve.cpp
ld -G --unresolved-symbols=ignore-all --warn-unresolved-symbols -o libmcve.a mcve.o
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x8): undefined reference to `SDL_GetTicks'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x23): undefined reference to `SDL_GetTicks'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x2f): undefined reference to `SDL_Delay'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x46): undefined reference to `std::ios_base::Init::~Init()'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x67): undefined reference to `std::ios_base::Init::Init()'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x73): undefined reference to `atexit'
这是我的源文件:
#include <SDL.h>
#include <iostream> //If I take this out, I no longer get the
//unresolved references to std::ios_base::Init::Init,
// std::ios_base::Init::~Init, and atexit
Uint32 time;
void doSomething ()
{
if (time > SDL_GetTicks ())
SDL_Delay (time - SDL_GetTicks());
}
这是生成文件。如果我取消注释其余的 LDFLAGS 并让 SDL 库 link 进入,它不会更改输出。
CFLAGS =-c -I../../../external/SDL2/include -I../include
LDFLAGS = --unresolved-symbols=ignore-all --warn-unresolved-symbols #-L. -lSDL2 -lSDL2_ttf -lSDL2_image -lSDL2_mixer
# Files
SOURCE_FILES= mcve.cpp
OBJECT_FILES= mcve.o
libmcve.a: $(OBJECT_FILES)
ld $(LDFLAGS) -o $@ $^ -G
$(OBJECT_FILES): %.o: $(SOURCE_FILES)
g++ -c $(CFLAGS) -o $@ $<
您正在尝试从对象文件创建静态库 libmcve.a
mcve.o
使用链接器 ld
.
链接器无法生成静态库。 static library 仅仅是
由 ar
.
生成的目标文件的 ar
存档
在 makefile 中创建或更新静态库的方法是:
libmcve.a: $(OBJECT_FILES)
rm -f $@ # Delete archive if already exists
ar rcs $@ $^ # Recreate archive with contents $(OBJECT_FILES)
顺便说一句,请注意您在编译命令中传递了 -c
选项
两次:
g++ -c -c -I../../../external/SDL2/include -I../include -o mcve.o mcve.cpp
那是因为您已将其包含在 CFLAGS
设置中:
CFLAGS =-c -I../../../external/SDL2/include -I../include
(不应该的地方),还有你的编译配方:
g++ -c $(CFLAGS) -o $@ $<
(它应该在的位置)。
我无法生成可与另一个库 (SDL) 配合使用的库。我正在使用 MinGW 进行制作,并使用 ld 到 link。我很困惑,因为 a) 它不应该在这些库中尝试 link,但稍后当有人 link 我的库也加入时再这样做; b) 即使我在 SDL 库中执行了 link,它仍然找不到 SDL 函数(SDL_GetTicks
、SDL_Delay
),它看起来是这样的——错误是相同的。另请注意,一些缺失的项目来自 std
.
这是错误。如您所见,我正在 ld 上尝试各种标志,使其不尝试解析引用,但 w/o 成功。
C:\Users\...\mcve>make
g++ -c -c -I../../../external/SDL2/include -I../include -o mcve.o mcve.cpp
ld -G --unresolved-symbols=ignore-all --warn-unresolved-symbols -o libmcve.a mcve.o
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x8): undefined reference to `SDL_GetTicks'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x23): undefined reference to `SDL_GetTicks'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x2f): undefined reference to `SDL_Delay'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x46): undefined reference to `std::ios_base::Init::~Init()'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x67): undefined reference to `std::ios_base::Init::Init()'
C:\MinGW\bin\ld.exe: mcve.o:mcve.cpp:(.text+0x73): undefined reference to `atexit'
这是我的源文件:
#include <SDL.h>
#include <iostream> //If I take this out, I no longer get the
//unresolved references to std::ios_base::Init::Init,
// std::ios_base::Init::~Init, and atexit
Uint32 time;
void doSomething ()
{
if (time > SDL_GetTicks ())
SDL_Delay (time - SDL_GetTicks());
}
这是生成文件。如果我取消注释其余的 LDFLAGS 并让 SDL 库 link 进入,它不会更改输出。
CFLAGS =-c -I../../../external/SDL2/include -I../include
LDFLAGS = --unresolved-symbols=ignore-all --warn-unresolved-symbols #-L. -lSDL2 -lSDL2_ttf -lSDL2_image -lSDL2_mixer
# Files
SOURCE_FILES= mcve.cpp
OBJECT_FILES= mcve.o
libmcve.a: $(OBJECT_FILES)
ld $(LDFLAGS) -o $@ $^ -G
$(OBJECT_FILES): %.o: $(SOURCE_FILES)
g++ -c $(CFLAGS) -o $@ $<
您正在尝试从对象文件创建静态库 libmcve.a
mcve.o
使用链接器 ld
.
链接器无法生成静态库。 static library 仅仅是
由 ar
.
ar
存档
在 makefile 中创建或更新静态库的方法是:
libmcve.a: $(OBJECT_FILES)
rm -f $@ # Delete archive if already exists
ar rcs $@ $^ # Recreate archive with contents $(OBJECT_FILES)
顺便说一句,请注意您在编译命令中传递了 -c
选项
两次:
g++ -c -c -I../../../external/SDL2/include -I../include -o mcve.o mcve.cpp
那是因为您已将其包含在 CFLAGS
设置中:
CFLAGS =-c -I../../../external/SDL2/include -I../include
(不应该的地方),还有你的编译配方:
g++ -c $(CFLAGS) -o $@ $<
(它应该在的位置)。