Python 3.3 неопределенные ссылки со статической связью

Операционная система: 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.

Если я разделю компиляцию на стадию объекта, а затем на двоичную стадию, двоичная стадия завершится с тем же сообщением об ошибке, что и упоминалось изначально.

1

Решение

Нашел решение: Python фактически устанавливает свое собственное решение для этого. Об этом говорится в этом посте (я знал, что мой заголовок не пропал, но я был глуп и пытался связать все это сам, думая: «О, это то, что нужно сделать, чтобы Python работал на моей платформе») ) …

Отсутствует заголовок Python.h

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]