CS107作业4编译报错:Makefile无法找到-lrssnews库
问题概况
在斯坦福大学CS107作业4执行make时出现链接错误,提示无法找到-lrssnews库,错误输出如下:
gcc -g -Wall -std=gnu99 -Wno-unused-function -c -o rss-news-search.o rss-news-search.c gcc rss-news-search.o -g -Wall -std=gnu99 -Wno-unused-function -g -lnsl -lrssnews -L/home/pi/Desktop/C/StanfordHW/Assn4/assn-4-rss-news-search-lib/ -o rss-news-search /usr/bin/ld: cannot find -lrssnews collect2: error: ld returned 1 exit status make: *** [Makefile:32: rss-news-search] Error 1
使用的Makefile片段:
CFLAGS = -g -Wall -std=gnu99 -Wno-unused-function $(DFLAG) LDFLAGS = -g $(SOCKETLIB) -lnsl -lrssnews -L/home/pi/Desktop/C/StanfordHW/Assn4/assn-4-rss-news-search-lib/$(OSTYPE) PFLAGS= -linker=/usr/pubsw/bin/ld -best-effort
已尝试将librssnews.a移至当前目录的/lib文件夹,但问题未解决。
解决方法
检查
OSTYPE变量的有效性
Makefile中链接路径包含$(OSTYPE)变量,需确认该变量是否正确展开为实际的系统子目录名。在终端执行echo $OSTYPE,查看输出值,然后检查/home/pi/Desktop/C/StanfordHW/Assn4/assn-4-rss-news-search-lib/下是否存在对应名称的子目录。若变量未定义或值不匹配,可手动替换为实际目录名,例如修改LDFLAGS为:LDFLAGS = -g $(SOCKETLIB) -lnsl -lrssnews -L/home/pi/Desktop/C/StanfordHW/Assn4/assn-4-rss-news-search-lib/linux确认库文件的存在与命名
进入库文件所在的目标目录,执行ls命令查看是否存在librssnews.a(静态库)或librssnews.so(动态库)。链接器解析-lrssnews时,会自动匹配前缀为lib、后缀为.a或.so的文件,若库文件名不符则无法识别。调整链接选项的顺序
链接器对选项顺序敏感,-L(指定库路径)必须放在-l(指定库名)之前,确保先定位路径再查找库。修改LDFLAGS的顺序:LDFLAGS = -g $(SOCKETLIB) -L/home/pi/Desktop/C/StanfordHW/Assn4/assn-4-rss-news-search-lib/$(OSTYPE) -lnsl -lrssnews直接使用库文件绝对路径链接
若上述方法无效,可跳过-L和-l选项,直接在链接命令中指定库文件的绝对路径。例如修改Makefile中的链接规则:rss-news-search: rss-news-search.o gcc $< -g -Wall -std=gnu99 -Wno-unused-function -lnsl /home/pi/Desktop/C/StanfordHW/Assn4/assn-4-rss-news-search-lib/[实际子目录名]/librssnews.a -o $@确认库文件是否需要预先编译
进入assn-4-rss-news-search-lib目录,检查是否存在独立的Makefile。若有,先执行make编译生成librssnews.a文件,再回到作业主目录执行make。
内容的提问来源于stack exchange,提问作者BenDerisgrate

