gpt4 book ai didi

c++ - 带有静态链接的 Python 3.3 undefined reference

转载 作者:太空宇宙 更新时间:2023-11-04 11:56:21 31 4
gpt4 key购买 nike

操作系统: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;
}

在 Makefile 的目录中键入 make 会产生以下消息。

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

根据我对 g++ 的“-l”参数的理解,它正在寻找 libpython3.3m.a,否则它会告诉我它无法找到库并退出。

那么,如果它正在查找库,为什么没有定义这些函数?

附加说明...

使用 --prefix 和 altinstall 构建 Python 以将其安装到新目录(我在我的 makefile 中将 LIBROOT 指向的目录)。

我已经确认 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

详细运行 Make...

    ...
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 在我的平台上工作的任何人需要做的事情” )...

Python.h header missing

关于c++ - 带有静态链接的 Python 3.3 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15993450/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com