定义_GNU_SOURCE后出现undefined reference编译错误该如何解决
编译报错原因
- 核心问题是链接参数顺序错误:GCC 采用的 GNU ld 链接器默认从左到右解析符号依赖,依赖库必须放在调用其函数的源文件/目标文件之后。你当前的编译命令把数学库
-lm、PostgreSQL 客户端库-lpq放在了源文件my_program.c前面,链接器加载库时还没有解析到源文件中对log10(属于libm)、PQntuples(属于libpq)的调用,会直接丢弃库中未被引用的符号,后续解析到源文件的函数调用时就会报未定义错误。 - 你的
_GNU_SOURCE宏定义放在所有头文件之前的写法是正确的,不需要修改代码头文件部分的逻辑。
解决方法
直接调整编译命令的参数顺序,将源文件放在依赖库之前即可:
gcc -Wall -Wextra -I/home/userX/postgresql/include -L/home/userX/postgresql/lib -g my_program.c -lm -lpq
额外注意事项
你提供的示例代码存在两个小问题,可自行修正避免后续报错:
- 代码中使用的
db_str变量未提前定义,可在sprintf前添加char db_str[256] = {0};定义足够长度的字符串缓冲区。 - 示例中调用的
DBConnect如果是你自行封装的接口,需要将对应的实现文件也加入编译参数,若直接使用libpq原生接口,替换为PQconnectdb(db_str)即可。
内容的提问来源于stack exchange,提问作者heisthere
相关产品推荐
相关产品推荐

