Gau*_*ier 1 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
Run Code Online (Sandbox Code Playgroud)
pkg-config 这样说:
$ pkg-config --cflags --libs libmodbus
-I/usr/local/include/modbus -L/usr/local/lib -lmodbus
Run Code Online (Sandbox Code Playgroud)
和文件/usr/local/lib是这些:
$ ls /usr/local/lib/ | grep mod
libmodbus.la
libmodbus.so
libmodbus.so.5
libmodbus.so.5.0.5
Run Code Online (Sandbox Code Playgroud)
此外,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
Run Code Online (Sandbox Code Playgroud)
我尝试添加/usr/local/lib到LD_LIBRARY_PATH,没有AV.不是因为我-L在编译器命令中有所帮助.
我也试过手动编写的-I,-L和-l(未使用pkg-config),并没有帮助.
如何让链接器理解对modbus_*函数的引用是否正确?
让我猜猜.
它在您编写此选项的命令中有所不同; 链接器按照指定的顺序搜索和处理库和目标文件.因此,'foo.o -lz bar.o'在文件foo.o之后但在bar.o之前搜索库'z'.如果bar.o引用'z'中的函数,则可能无法加载这些函数.
http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
所以尽量把它放在pkg-config --cflags --libs libmodbus最后