Ubuntu下C++嵌入Python报错/usr/bin/ld: cannot find -lpython3.7求Makefile修改
问题与解决方案
问题背景
在Ubuntu 18.04.6 LTS系统中,将Python 3.7.3手动安装到/home/zain/Desktop/MobileNet_basic/practice/Python目录,编写C++代码嵌入Python解释器时,编译出现链接错误:
/usr/bin/ld: cannot find -lpython3.7
Makefile修改建议
核心问题分析
原Makefile存在3个关键错误:
- 库路径
LIB指向错误,并非Include/Lib,而是Python安装目录下的lib文件夹 - 库文件名错误,Ubuntu手动编译的Python库默认带
m后缀(对应libpython3.7m.so) - 编译器选择错误,C代码应使用
g++而非gcc,否则会缺失C标准库链接支持
修改后的Makefile(手动指定路径版本)
# Makefile PYTHON_DIR = /home/zain/Desktop/MobileNet_basic/practice/Python # 用g++编译C++代码 CXX = g++ EXE = main SRC = main.cpp OBJ = $(SRC:.cpp=.o) # 包含Python的头文件目录 CFLAGS = -std=c++11 -I$(PYTHON_DIR)/Include -I$(PYTHON_DIR) # 链接Python库(注意带m后缀),指定正确的库路径 LDFLAGS = -lm -L$(PYTHON_DIR)/lib -lpython3.7m DEPS=$(SRC:%.cpp=%.d) all: $(EXE) $(EXE): $(OBJ) $(CXX) $(OBJ) $(CFLAGS) $(LDFLAGS) -o $@ %.o: %.cpp $(CXX) $(CFLAGS) -MMD -MP $< -o $@ clean: rm -rf *.o *.d $(EXE) -include $(DEPS)
更可靠的版本(用python-config自动生成参数)
如果不想手动维护路径和库名,可以直接调用Python自带的python3.7-config工具获取编译链接参数,避免手动出错:
# Makefile PYTHON_CONFIG = /home/zain/Desktop/MobileNet_basic/practice/Python/bin/python3.7-config CXX = g++ EXE = main SRC = main.cpp OBJ = $(SRC:.cpp=.o) # 用python-config获取编译参数 CFLAGS = -std=c++11 $(shell $(PYTHON_CONFIG) --cflags) # 用python-config获取链接参数 LDFLAGS = $(shell $(PYTHON_CONFIG) --ldflags) DEPS=$(SRC:%.cpp=%.d) all: $(EXE) $(EXE): $(OBJ) $(CXX) $(OBJ) $(CFLAGS) $(LDFLAGS) -o $@ %.o: %.cpp $(CXX) $(CFLAGS) -MMD -MP $< -o $@ clean: rm -rf *.o *.d $(EXE) -include $(DEPS)
额外说明
- 确保Python安装目录下的
lib文件夹中存在libpython3.7m.so(或对应软链接) - 使用
python-config版本时,要确保指定的是自己安装的Python的python3.7-config路径,而非系统默认版本
内容的提问来源于stack exchange,提问作者zain
相关产品推荐
相关产品推荐

