G ++ не включает библиотеки

Я пытаюсь построить программу с g ++, но я получаю «неопределенные ссылки».

Структура папок:

Makefile
libs/
libcrypotpp.a
libz.a
sources/
here are the sources and headers
out/
objfiles/

Makefile выглядит следующим образом:

#makefile for program
#needs libz.a and libcryptopp.a

CC = g++
SOURCES = sources/*.cpp
LIBS = -lcryptopp -lz -pthread
LIBPATH = libs/
OBJPATH = objfiles/
OUTPUT = out/
OBJS = *.o
HEADERPATHS = -Isources -Isources/cryptopp

all:
echo "Program"echo "------------------"ifneq ("$(wildcard libs/libz.a)", "")
echo "ZLIB found!"ifneq ("$(wildcard libs/libcryptopp.a)", "")
echo "Cryptopp found!"  #all librarys found
$(CC) $(HEADERPATHS) -L$(LIBPATH) $(LIBS) $(SOURCES)
mv *.o $(OBJPATH)
else
echo "error: Cryptopp(libs/libcryptopp.a) was not found!"endif
else ifneq ("$(wildcard libs/libcryptopp.a)", "")
echo "Cryptopp found!"echo "error: ZLIB(libs/libz.a) was not found!"else
echo "error: ZLIB(libs/libz.a) was not found!"echo "error: Cryptopp(libs/libcryptopp.a) was not found!"endif

.SILENT: all

g ++ компилируется, но затем выводит неопределенные ссылки:

неопределенные ссылки

Почему это не удается?

1

Решение

Поскольку (статические) библиотеки могут содержать большой объем кода, который остается неиспользуемым в большинстве приложений, которые ссылаются на них, компоновщики обычно очень консервативны в отношении того, какие части статической библиотеки они будут связывать в приложении.

В некоторых случаях это усложняет нашу жизнь разработчика, так как вы должны следовать неписаным правилам, чтобы все было хорошо. Некоторые из этих неписаных правил

  • что компоновщик обрабатывает свои входные данные в том порядке, в котором они указаны в командной строке
  • что компоновщик считает только библиотеки в первом проходе по входам
    Эти два вместе дают эффект, что библиотеки могут разрешать только неразрешенные символы, которые были найдены в более ранних входах для компоновщика.

В результате, чтобы компоновщик был доволен, библиотеки должны указываться последними, а если библиотека A зависит от библиотеки B, A следует указывать перед B.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector