如何配置环境以使用LLVM Clang构建嵌入Python的C代码
我正在尝试编译一个用C语言写的程序,这个程序里面嵌入了Python代码。
我运行了 python3.3-config -cflags
来获取我在这个命令中使用的编译标志。
% >> clang -v einformer.c -o einformer - I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include
Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix
"/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.8.0 -emit-obj -disable-free -disable-llvm-verifier -main-file-name einformer.c -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 136 -v -g -resource-dir /usr/bin/../lib/clang/4.2 -D NDEBUG -I /usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -I /usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -I /usr/local/include -I /usr/local/opt/sqlite/include -fmodule-cache-path /var/folders/lz/5nhsdlnn3x9g8ry_mkgtgh500000gp/T/clang-module-cache -c-isystem /usr/include/python2.6 -c-isystem . -O3 -Wno-unused-result -Wall -Wstrict-prototypes -fdebug-compilation-dir /Users/ardentapprentice/dev/osx/test -ferror-limit 19 -fmessage-length 140 -fwrapv -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.8.0 -fobjc-dispatch-method=mixed -fobjc-default-synthesize-properties -fno-common -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/lz/5nhsdlnn3x9g8ry_mkgtgh500000gp/T/einformer-T6nymD.o -x c einformer.c
clang -cc1 version 4.2 based upon LLVM 3.2svn default target x86_64-apple-darwin12.2.0
ignoring duplicate directory "/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m"
ignoring duplicate directory "/usr/local/include"
as it is a non-system directory that duplicates a system directory
#include "..." search starts here:
#include <...> search starts here:
/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m
/usr/local/opt/sqlite/include
/usr/include/python2.6
.
/usr/local/include
/usr/bin/../lib/clang/4.2/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
einformer.c:92:25: warning: implicit declaration of function 'PyString_AsString' is invalid in C99 [-Wimplicit-function-declaration]
path_array[i] = PyString_AsString(pypath);
^
1 warning generated.
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -dynamic -macosx_version_min 10.8.0 -o einformer /var/folders/lz/5nhsdlnn3x9g8ry_mkgtgh500000gp/T/einformer-T6nymD.o -lSystem /usr/bin/../lib/clang/4.2/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
"_PyList_GetItem", referenced from:
_main in einformer-T6nymD.o
"_PyList_Size", referenced from:
_main in einformer-T6nymD.o
"_PyRun_SimpleStringFlags", referenced from:
_main in einformer-T6nymD.o
"_PyString_AsString", referenced from:
_main in einformer-T6nymD.o
"_Py_Finalize", referenced from:
_main in einformer-T6nymD.o
"_Py_Initialize", referenced from:
_main in einformer-T6nymD.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
看起来clang在找头文件的时候遇到麻烦了?我在源代码中包含了 <Python.h>
,但我不太确定我哪里做错了 :/
我花了大约3个小时在查阅Python的文档 http://docs.python.org/3.3/c-api/index.html 和在网上搜索,但似乎找不到任何能帮我的信息。
1 个回答
1
python3.3-config --cflags
这个命令只会提供找到头文件所需的参数。头文件就像是程序的说明书,告诉编译器如何使用Python的功能。而 python3.3-config --ldflags
则会给你链接器的标志。链接器就像是把不同部分的程序拼在一起的工具。这意味着你可以用类似下面的命令来编译你的程序:
clang -v einformer.c -o einformer $(python3.3-config --cflags) $(python3.3-config --ldflags)