Связывание со статической библиотекой - PullRequest
1 голос
/ 22 декабря 2010

gcc Версия: 4: 4.4.4-1ubuntu2 GNU Make 3.81

У меня есть следующая библиотека с именем net_api.a и некоторые файлы заголовков, например

network_set.h

У меня есть заголовокфайл в моем исходном коде в моем файле main.c

#include <network_set.h>

У меня есть следующая статическая библиотека и заголовок в следующем каталоге

./tools/net/lib/net_api.a
./tools/net/inc/network_set.h

В моем Makefile я пытался связать, используяследующий фрагмент кода:

INC_PATH = -I tools/net/inc
LIB_PATH = -L tools/net/lib

LIBS = -lnet_api

$(TARGET): $(OBJECT_FILES)
    $(CC) $(LDFLAGS) $(CFLAGS) $(INC_PATH) $(LIB_PATH) $(LIBS) $(OBJECT_FILES) -o $(TARGET)

main.o: main.c
    $(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) -c main.c

Однако, когда я компилирую, я получаю следующие ошибки:

network_set.h error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘network_String’

Что здесь не так?

Ответы [ 3 ]

2 голосов
/ 23 декабря 2010

1001 * Компиляция * Первая проблема, с которой вам приходится сталкиваться, заключается в том, почему код не компилируется. В заголовке network_set.h есть проблема; в некотором роде он не самодостаточен, поэтому вам нужно включить что-то еще, прежде чем включать его, или вы должны явно настроить его каким-либо образом. Вы должны стремиться к тому, чтобы ваши заголовки были как автономными, так и идемпотентными. автономный может быть включен без каких-либо других предшествующих ему заголовков идемпотент можно включать несколько раз, не вызывая хаоса Самодостаточность достигается за счет того, что он может быть первым заголовком, включенным в исходный файл, и затем корректно компилироваться. Это означает, что если он использует функцию (например, size_t), то он включает заголовок, который определяет функцию (например, <stddef.h>). Идемпотентность достигается путем включения защиты заголовка: #ifndef HEADER_H_INCLUDED #define HEADER_H_INCLUDED ...main body of header... #endif /* HEADER_H_INCLUDED */ Я использую следующий сценарий, называемый chkhdr, для обеспечения автономности и идемпотентности заголовков. #!/bin/ksh # # @(#)$Id: chkhdr.sh,v 1.2 2010/04/24 16:52:59 jleffler Exp $ # # Check whether a header can be compiled standalone tmp=chkhdr-$$ trap 'rm -f $tmp.?; exit 1' 0 1 2 3 13 15 cat >$tmp.c <<EOF #include HEADER /* Check self-containment */ #include HEADER /* Check idempotency */ int main(void){return 0;} EOF options= for file in "$@" do case "$file" in (-*) options="$options $file";; (*) echo "$file:" gcc $options -DHEADER="\"$file\"" -c $tmp.c ;; esac done rm -f $tmp.? trap 0 Например: chkhdr -Itools/net/inc tools/net/inc/network_set.h Linking

Со временем, после исправления проблем компиляции, вы столкнетесь с проблемами компоновки. Опция -lnet_api ищет библиотеку с именем libnet_api.so или libnet_api.a.

Чтобы связать с net_api.a, вам нужно будет передать путь к файлу команде link:

LIB_DIR     = ./tools/net/lib
LIB_NET_API = net_api.a
LIB_PATH    = -L ${LIB_DIR}

    ${CC} ... ${LIB_DIR}/${LIB_NET_API} ...

Очевидно, вы можете определить макрос для пути ко всей библиотеке. Обратите внимание, как я переопределил LIB_PATH в терминах макроса LIB_DIR.

2 голосов
/ 22 декабря 2010

Заголовок network_set.h имеет дополнительные зависимости, которые должны быть включены в первую очередь, одной из которых является определение network_String.Обратитесь к документации библиотеки или обратитесь к автору за более подробной информацией.

1 голос
/ 23 декабря 2010

Вы не показываете свои LDFLAGS; Я предполагаю, что они определены, но вы просто не опубликовали их. Они должны включать «-static», если вы строите против статической библиотеки.

Если вы не знаете, что это такое, посмотрите на вывод компилятора в начале, где он начинается с "gcc", и посмотрите, появляется ли там "-static".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...