Makefile编译二进制,而不是可执行文件

raz*_*e92 1 c++ python macos makefile g++

当我在make之后运行可执行文件时,bash引发以下错误:

$ ./prog 
-bash: ./prog: cannot execute binary file
Run Code Online (Sandbox Code Playgroud)

我的makefile:

CC = g++ -std=c++11
LDFLAGS = -undefined dynamic_lookup -bundle
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 -r *.o
Run Code Online (Sandbox Code Playgroud)

我错了什么?


更新2:

感谢您的评论 SergayA.在本文的帮助下链接python后它可以工作.


更新1:

-undefined dynamic_lookup -bundle在一些评论后删除了标志,所以我遇到了Python的问题.要使用Python.hi,请将环境变量设置为此路径: CPLUS_INCLUDE_PATH=/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/

2 warnings generated.
g++ -std=c++11 -c datetime.cpp
g++ -std=c++11 -c logger.cpp
g++ -std=c++11 -c WeatherApi.cpp
g++ -std=c++11 -c tinyxml2.cpp
g++ -std=c++11 -c tflower.cpp
g++ -std=c++11 -c tservo.cpp
g++ -std=c++11 -o prog main.o datetime.o logger.o WeatherApi.o tinyxml2.o tflower.o tservo.o 
Undefined symbols for architecture x86_64:
  "_PyDict_GetItemString", referenced from:
      WeatherApi::SayHelloWorld() in WeatherApi.o
      WeatherApi::GetAirTemperature() in WeatherApi.o
  "_PyErr_Print", referenced from:
      WeatherApi::WeatherApi(char*, char*) in WeatherApi.o
      WeatherApi::GetAirTemperature() in WeatherApi.o
  "_PyImport_Import", referenced from:
      WeatherApi::WeatherApi(char*, char*) in WeatherApi.o
  "_PyModule_GetDict", referenced from:
      WeatherApi::WeatherApi(char*, char*) in WeatherApi.o
  "_PyObject_CallObject", referenced from:
      WeatherApi::SayHelloWorld() in WeatherApi.o
      WeatherApi::GetAirTemperature() in WeatherApi.o
  "_PyString_AsString", referenced from:
      WeatherApi::GetAirTemperature() in WeatherApi.o
  "_PyString_FromString", referenced from:
      WeatherApi::WeatherApi(char*, char*) in WeatherApi.o
      WeatherApi::GetAirTemperature() in WeatherApi.o
  "_PyTuple_New", referenced from:
      WeatherApi::GetAirTemperature() in WeatherApi.o
  "_PyTuple_SetItem", referenced from:
      WeatherApi::GetAirTemperature() in WeatherApi.o
  "_Py_Finalize", referenced from:
      WeatherApi::~WeatherApi() in WeatherApi.o
  "_Py_Initialize", referenced from:
      WeatherApi::WeatherApi(char*, char*) in WeatherApi.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [prog] Error 1
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 6

我错了什么?

既然你显然想要一个可以直接执行的程序,那么你做错了就是指定g ++ -bundle选项.这指示输出应该是Mach-o 包格式文件.这些文件不能直接执行.它们可以在运行时通过系统的动态链接函数加载到另一个程序中,这些函数可用于实现插件和类似的程序功能.删除此选项.

-undefined dynamic_lookup看起来可疑,太.我猜你复制了那个和-bundle其他Makefile 的选项.如果你不知道那里有什么,你也应该放弃它.