Makefile编译无法执行二进制文件及Python链接问题求助
问题分析与解决方案
1. 初始问题:生成的文件无法执行
你遇到的-bash: ./prog: cannot execute binary file错误,根源在Makefile的LDFLAGS参数上:
LDFLAGS = -undefined dynamic_lookup -bundle
-bundle是macOS下用来生成**Mach-O动态bundle(比如Python扩展模块)**的参数,不是用来编译可执行程序的。当你加上这个参数,g++会输出一个动态库格式的文件,而不是可执行二进制,所以bash无法运行它。
解决方法:直接移除这两个参数,删掉LDFLAGS这一行(或者清空它)。
2. 后续问题:链接阶段缺失Python符号
移除bundle参数后,你遇到了Python相关的链接错误,这是因为你只让编译器找到了Python.h头文件(通过CPLUS_INCLUDE_PATH),但链接器不知道要链接Python的库文件,所以那些_PyDict_GetItemString、Py_Initialize等Python API符号无法被解析。
解决方法:在LDFLAGS中添加Python库的链接参数。针对你用的Python 2.7,修改Makefile如下:
CC = g++ -std=c++11 # 添加Python库的搜索路径和链接参数 LDFLAGS = -L/System/Library/Frameworks/Python.framework/Versions/2.7/lib -lpython2.7 OBJ = main.o datetime.o logger.o WeatherApi.o tinyxml2.o tflower.o tservo.o prog: $(OBJ) $(CC) -o $@ $(OBJ) $(LDFLAGS) %.o: %.cpp $(CC) -c $< clean: rm -f *.o prog # 修正rm参数,-r用于删除目录,这里用-f删除文件更合适
-L指定Python库文件的搜索路径,告诉链接器去哪里找libpython2.7.dylib-lpython2.7告诉链接器要链接Python 2.7的库文件,这样所有Python API符号就能被正确解析了。
这样修改后重新执行make,应该就能成功生成可执行的prog文件了。
内容的提问来源于stack exchange,提问作者micharaze
相关产品推荐
相关产品推荐

