Операционная система: Ubuntu 12.04 x86_64
Я скомпилировал libpython3.3m.a из исходного кода вместе со связанными заголовками. Я написал следующий Makefile (в частности, посмотрите на мою переменную CFLAGS, которая включает в себя -lpython3.3m) …
BINS=python python-d
SOURCES=python.cpp
LIBROOT=/home/uberblah/lib/cpp
LIBDIR=$(LIBROOT)/lib
BINDIR=$(LIBROOT)/bin
INCDIR=$(LIBROOT)/include
CFLAGS= -I$(INCDIR)/python3.3m -L$(LIBDIR) -lpython3.3m
all: $(BINS)
python-d: $(SOURCES)
g++ $(CFLAGS) -g -o $@ $^
python: $(SOURCES)
g++ $(CFLAGS) -o $@ $^
clean::
rm -r -f *~ $(BINS)
edit::
gedit $(SOURCES) Makefile &
И я написал следующий исходный файл .cpp …
#include <Python.h>
int main(int argc, char** argv)
{
Py_SetProgramName((wchar_t*)argv[0]); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n""print 'Today is',ctime(time())\n");
Py_Finalize();
return 0;
}
Ввод make в каталоге Makefile приводит к следующим сообщениям.
g++ -I/home/uberblah/lib/cpp/include/python3.3m -L/home/uberblah/lib/cpp/lib -lpython3.3m -o python python.cpp
/tmp/ccBD4sLY.o: In function `main':
python.cpp:(.text+0x1a): undefined reference to `Py_SetProgramName'
python.cpp:(.text+0x1f): undefined reference to `Py_Initialize'
python.cpp:(.text+0x2e): undefined reference to `PyRun_SimpleStringFlags'
python.cpp:(.text+0x33): undefined reference to `Py_Finalize'
collect2: ld returned 1 exit status
make: *** [python] Error 1
Основываясь на моем понимании аргумента ‘-l’ для g ++, он находит libpython3.3m.a, потому что в противном случае он сказал бы, что не может найти библиотеку и выйти.
Итак, если он находит библиотеку, почему эти функции не определены?
ДОПОЛНИТЕЛЬНЫЕ ПРИМЕЧАНИЯ…
Построил Python с использованием —prefix и altinstall, чтобы установить его в новый каталог (тот, на который я указываю LIBROOT в моем make-файле).
Я подтвердил, что libpython3.3m.a находится в $ (LIBDIR)
используя nm для проверки Py_SetProgramName …
uberblah@uberblah-N80Vm:~/lib/cpp/lib$ nm libpython3.3m.a | grep Py_SetProgramName
U Py_SetProgramName
0000000000001c00 T Py_SetProgramName
U Py_SetProgramName
Запуск Сделать многословно …
...
Finished prerequisites of target file `python'.
Must remake target `python'.
g++ -I/home/uberblah/lib/cpp/include/python3.3m -L/home/uberblah/lib/cpp/lib -lpython3.3m -o python python.cpp
Putting child 0x00a585b0 (python) PID 16811 on the chain.
Live child 0x00a585b0 (python) PID 16811
/tmp/cc2dom1S.o: In function `main':
python.cpp:(.text+0x1a): undefined reference to `Py_SetProgramName'
python.cpp:(.text+0x1f): undefined reference to `Py_Initialize'
python.cpp:(.text+0x2e): undefined reference to `PyRun_SimpleStringFlags'
python.cpp:(.text+0x33): undefined reference to `Py_Finalize'
collect2: ld returned 1 exit status
Reaping losing child 0x00a585b0 PID 16811
make: *** [python] Error 1
Removing child 0x00a585b0 PID 16811 from chain.
Если я разделю компиляцию на стадию объекта, а затем на двоичную стадию, двоичная стадия завершится с тем же сообщением об ошибке, что и упоминалось изначально.
Нашел решение: Python фактически устанавливает свое собственное решение для этого. Об этом говорится в этом посте (я знал, что мой заголовок не пропал, но я был глуп и пытался связать все это сам, думая: «О, это то, что нужно сделать, чтобы Python работал на моей платформе») ) …
Других решений пока нет …