g++中-L -lmylib参数未生效,静态库链接报错求助
g++链接静态库出现未定义引用的问题
问题场景
执行编译命令:
g++ -L/home/xxx/make_test -lmylib main.o -o myprogram2
时触发链接错误:
/usr/local/bin/ld: main.o: in function `main': main.cpp:(.text+0x9): undefined reference to `f' collect2: error: ld returned 1 exit status
但直接指定静态库文件的命令可以成功编译:
g++ main.o libmylib.a -o myprogram
疑惑点:-L/home/xxx/make_test -lmylib已经指定了库的搜索路径和库名,不清楚为何仍报错。
文件目录结构
├── lib │ ├── mylib.cpp │ ├── mylib.h │ └── mylib.o ├── libmylib.a ├── main.cpp ├── main.o ├── Makefile ├── mylib ├── mylib.a └── myprogram
相关代码
main.cpp
#include "lib/mylib.h" int main(){ f(); return 0; }
mylib.cpp
#include "mylib.h" int f(){ return 1; } int b(){ return 2; }
mylib.h
#ifndef MAKE_TEST_MYLIB_H #define MAKE_TEST_MYLIB_H extern "C" int f(); extern "C" int b(); #endif //MAKE_TEST_MYLIB_H
问题原因及解决方法
核心原因:链接顺序错误
g++的链接器处理文件时遵循“先处理的文件不会为后处理的文件提供符号”的规则。你当前命令中-lmylib放在main.o前面,链接器先扫描库文件,但此时还没有遇到需要调用f()的main.o,会直接跳过库中的符号;后续处理main.o时,找不到f()的定义就会报错。次要排查点:库命名匹配
目录中存在mylib.a和libmylib.a两个库文件,-lmylib会优先匹配符合命名规范的libmylib.a,但如果mylib.a被错误识别(比如链接器配置异常),也可能导致符号缺失。不过从你直接指定libmylib.a能成功的情况来看,这个不是主要问题。
修复命令
调整目标文件和库的顺序,将依赖库的目标文件放在库前面:
g++ main.o -L/home/xxx/make_test -lmylib -o myprogram2
内容的提问来源于stack exchange,提问作者syheliel
相关产品推荐
相关产品推荐

