ld: неопределенная ссылка, но она должна оставить их неразрешенными - PullRequest
0 голосов
/ 07 февраля 2019

Я не могу создать библиотеку, которая работает с другой библиотекой (SDL).Я использую MinGW для make и ld для связи.Я сбит с толку, потому что: а) он не должен пытаться связываться с этими библиотеками, а делать это позже, когда кто-то также связывает мою библиотеку;и б) даже если я сделаю ссылку в библиотеках SDL, он все равно не сможет найти функции SDL (SDL_GetTicks, SDL_Delay), которые выглядят так: ошибки одинаковы.Также обратите внимание, что некоторые из пропущенных элементов относятся к std.

Вот ошибки.Как видите, я пытаюсь использовать различные флаги на ld, чтобы он не пытался разрешать ссылки, но пока безуспешно.

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());
}

Это Makefile.Если я раскомментирую остальные LDFLAGS и разрешу подключать библиотеки SDL, это не изменит выходных данных.

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 $@ $<

1 Ответ

0 голосов
/ 08 февраля 2019

Вы пытаетесь создать статическую библиотеку libmcve.a из объектного файла mcve.o, используя компоновщик ld.

Компоновщик не может создать статическую библиотеку. статическая библиотека - это просто 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 $@ $<

(там, где это должно быть).

...