如何链接到共享库?

时间:2014-09-25 13:57:01

标签: c linux shared-libraries

我从源代码安装了一个新的lib,我正在尝试链接到它。链接器抱怨它无法找到应该在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

此外,so文件包含未定义的引用:

$ 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,但没有。不是因为我在编译器命令中有-L所以它会有所帮助。

我还尝试手动编写-I-L-l(不使用pkg-config),这对我们没有帮助。

如何让链接器理解modbus_*函数的引用是否正确?

1 个答案:

答案 0 :(得分: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放在最后