-L
указывает библиотеку путь , а не конкретную библиотеку. Возможно, вы хотите, чтобы -L sdp/lib -l sdpAPI
указывал и путь , и имя библиотеки.
Хотя он попытается добавить префикс и постфикс к имени вашей библиотеки с помощью lib
и либо .a
, либо .sl
(или аналогичного).
Так что вам также может понадобиться переименовать вашу библиотеку в libsdpAPI.a
согласно man-странице gcc:
-l xyz
Компоновщик ищет стандартный список каталогов для библиотеки, который на самом деле является файлом с именем libxyz.a
.
Также имейте в виду, что порядок вещей в командной строке имеет значение. Делая $(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) $(OBJECT_FILES) -o $(TARGET)
(библиотеки перед объектами), в точке, где вы перечисляете библиотеку, нет неразрешенных символов, поэтому из этой библиотеки ничего не будет выведено.
Затем, когда вы наконец вводите объекты (с их неразрешенными символами), они остаются неразрешенными, поскольку после этого нет библиотек.
Обычно вы должны делать библиотеки после объектов:
$(CC) $(CFLAGS) $(INC_PATH) $(OBJECT_FILES) $(LIB_PATH) -o $(TARGET)
для проверки всех неразрешенных символов перед проверкой библиотек.
Это не решит все проблемы (например, создание зависимых библиотек, которые могут быть исправлены с помощью других средств), но обеспечит известность всех неразрешенных символов в файлах object перед просмотром библиотек. .
Из того же раздела справочной страницы, указанной выше:
Имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке. Таким образом, foo.o -lz bar.o
ищет библиотеку z
после файла foo.o
, но до bar.o
. Если bar.o
относится к функциям в z
, эти функции могут не загружаться.