c - 链接器错误: undefined reference to shared object

标签 c compilation linker makefile shared-libraries

我正在尝试在我的 C 程序中使用名为 iniparser 的外部库。我使用的是 gcc 4.4。

我将iniparser库放在一个名为lib/的子目录中,头文件位于lib/iniparser/src中,并且该库被编译到lib/iniparser/libiniparser.so.0.

我编写了一个简短的 Makefile 来编译它,这是 make 的输出:

gcc -Wall -Wextra -Werror -c -I include/ src/smag_main.c -L lib/iniparser -liniparser -I lib/iniparser/src
gcc -Wall -Wextra -Werror -c -I include/ -L lib/iniparser -liniparser -I lib/iniparser/src src/agros.c
gcc -Wall -Wextra -Werror -c -I include/ -L lib/iniparser -liniparser -I lib/iniparser/src src/main.c
gcc -Wall -Wextra -Werror -L lib/iniparser -liniparser -o agros smag_main.o main.o agros.o
smag_main.o: In function `sec_haskey':
smag_main.c:(.text+0xa9): undefined reference to `iniparser_find_entry'
smag_main.o: In function `parse_config':
smag_main.c:(.text+0x153): undefined reference to `iniparser_load'
smag_main.c:(.text+0x18b): undefined reference to `iniparser_getint'
smag_main.c:(.text+0x1c6): undefined reference to `iniparser_getstring'
smag_main.c:(.text+0x202): undefined reference to `iniparser_getstring'
smag_main.c:(.text+0x261): undefined reference to `iniparser_getstring'
smag_main.c:(.text+0x2c2): undefined reference to `iniparser_getint'
smag_main.c:(.text+0x2d5): undefined reference to `iniparser_freedict'
collect2: ld returned 1 exit status
make: *** [agros] Error 1

第一次调用 gcc 成功编译 smag_main.o,第二次调用编译 agros.o,第三次调用 main.o。第四个调用是链接器,它将所有这些对象链接到可执行文件agros。显然失败了。

看起来在链接时定位 iniparser.so 时遇到问题。我的电话怎么错了?
我很困惑。

(另一个问题,如果有人可以解释如何通过直接调用 ld 进行链接,那就太好了)。

最佳答案

尝试将符号链接(symbolic link)从 libiniparser.so.0 放置到 libiniparser.so

 cd lib/iniparser/
 ln -s libiniparser.so.0 libiniparser.so

关于c - 链接器错误: undefined reference to shared object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7698937/

相关文章:

c - 从同一结构中的函数指针访问变量

c++ - 如何在 C/C++ 源代码中使用函数 typedef?

java - 在没有客户端调用的网络服务中,我可以发送文件并执行一些操作吗?

linux - 编译后无法识别 gcc 7.1 参数

c++ - undefined reference 错误c++

visual-c++ - MS VC 链接器 (link.exe) : Why no warning for 32/64 bit CPU architecture mismatch?

c++ - 链接器如何决定代码执行将从哪里开始? [嵌入式]

mysql - C API mysql 添加列(如果不存在)语法错误

c - 使用C实现基数排序

c - GCC 相关搜索目录