2014-09-25 2 views
1

Я установил новую библиотеку из источника, и я пытаюсь установить ссылку на нее. Компилятор жалуется, что он не может найти символы, которые должны быть в lib.Как подключиться к общей библиотеке?

Вот ошибки я получаю:

$ make all 
gcc -std=c99 -g -Wall -O3 `pkg-config --cflags --libs libmodbus` -c client.c -o client.o 
gcc -std=c99 -g -Wall -O3 `pkg-config --cflags --libs libmodbus` client.o -o client 
client.o: In function `main': 
/home/gauthier/code/modbus/client.c:29: undefined reference to `modbus_new_tcp' 
/home/gauthier/code/modbus/client.c:30: undefined reference to `modbus_connect' 
/home/gauthier/code/modbus/client.c:33: undefined reference to `modbus_read_registers' 
/home/gauthier/code/modbus/client.c:35: undefined reference to `modbus_close' 
/home/gauthier/code/modbus/client.c:36: undefined reference to `modbus_free' 
collect2: error: ld returned 1 exit status 
make: *** [client] Error 1 

pkg-config говорит, что это:

$ pkg-config --cflags --libs libmodbus 
-I/usr/local/include/modbus -L/usr/local/lib -lmodbus 

и файлы в /usr/local/lib таковы:

$ ls /usr/local/lib/ | grep mod 
libmodbus.la 
libmodbus.so 
libmodbus.so.5 
libmodbus.so.5.0.5 

Кроме того, таким образом файл содержит Неопределенные ссылки:

$ grep modbus_connect /usr/local/lib/* 
Binary file /usr/local/lib/libmodbus.so matches 
Binary file /usr/local/lib/libmodbus.so.5 matches 
Binary file /usr/local/lib/libmodbus.so.5.0.5 matches 

Я пробовал добавить /usr/local/lib в LD_LIBRARY_PATH, чтобы нет av. Не то чтобы я, хотя это помогло бы, так как у меня есть -L в моей команде компилятора в любом случае.

Я также попытался вручную написать -I, -L и -l (не используя pkg-config), это не помогло.

Как мне сделать компоновщик понятным, что ссылки на функции modbus_* есть?

+0

НКУ -v ххх, чтобы увидеть многословным – farmer1992

+0

положить -lmodbus до конца – farmer1992

ответ

5

Позвольте мне угадать.

Имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в порядке , они указаны. Таким образом, «foo.o -lz bar.o» выполняет поиск библиотеки «z» после файла foo.o, но до bar.o. Если bar.o относится к функциям в 'z', , эти функции не могут быть загружены.

http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

Так попытайтесь поместить pkg-config --cflags --libs libmodbus в конце

+0

Самое худшее, что я на самом деле уже читал, но неправильно его , Я, тем не менее, что компоновщик читал слева направо и нуждался в том, чтобы прочитать lib перед чтением объектного файла, который будет использовать его. Напротив, компоновщик, похоже, должен знать, какие символы отсутствуют, прежде чем принимать их из библиотеки. – Gauthier

Смежные вопросы