Visual Studio, Marmalade C++:在ARM上导入libpython.a并运行嵌入式解释器中的Python代码
我正在尝试在嵌入式解释器中运行 Python 代码,目标是 ARM 设备;我是在 Visual Studio 2012 中使用 Marmalade Studio 构建的。
我已经构建了我的静态链接库,叫做 libpython.a,并把它放在了 \lib\arm\libpython.a(还有 libpython_d.a)下。
我为 ARM 编译了 Python 库,加载 'libpython.a' 似乎没问题,当我指定了错误的外部函数参数数据类型时,“VS:intellisense”给我报了错。(这其实是好事,说明至少有东西连接上了)
我的 Marmalade .mkb 构建文件看起来是这样的:
files
{
RunPython.cpp
}
subprojects
{
}
librarys
{
<arm_shared>
"./lib,libpython"
}
RunPython.cpp
extern void PyRun_SimpleString(const char*);
extern void Py_Initialize(void);
extern void Py_Finalize(void);
const char *pycode=
"print('This is python code')\n";
// Main entry point for the application
int main()
{
//python shared library test
Py_Initialize();
PyRun_SimpleString(pycode);
Py_Finalize();
return 0;
}
问题: 我在处理时有哪些选项? 错误 MSB6006:“link.exe” 退出,代码为 1。
我已经关闭了整个程序优化。
更新:
我在全新的 Windows 7 64 位安装上重新安装了开发环境,安装了 Visual Studio 2012 Express 和 Marmalade 7.2。
我在项目文件中添加了适当的链接;但仍然收到: 错误 MSB6006:“link.exe” 退出,代码为 1。
我决定使用进程监视器查看运行时访问的目录(记住我需要的库在一个叫“libpython”的文件夹里):
arm-none-eaabi-g++.exe
command:
"c:/marmalade/7.2/s3e/gcc/win32/bin/arm-none-eabi-g++.exe" "@arm-none-eabi-g++_cmd_line_MainThread.txt"
childprocess:
collect2.exe
command:
"c:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/collect2.exe" "--sysroot=c:\marmalade\7.2\s3e\gcc\win32\bin\../arm-none-eabi" "-X" "-pie" "-o" "Debug_RunPython_vc11x_gcc_arm/RunPython.elf" "c:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/crti.o" "c:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/crtbegin.o" "c:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/crt0.o" "-Lc:/marmalade/7.2/s3e/lib/arm" "-Lc:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4" "-Lc:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc" "-Lc:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib" "-Lc:/marmalade/7.2/s3e/gcc/win32/bin/../arm-none-eabi/lib" "@C:\Users\root\AppData\Local\Temp\cc8DfmXx" "--start-group" "-lgcc" "-lc" "--end-group" "c:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/crtend.o" "c:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/crtn.o"
childprocess:
ld.exe
command: "c:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/bin/ld.exe" "@C:\Users\root\AppData\Local\Temp\cce3XLB7"
有没有人知道为什么链接器根本没有查看这些目录? 我一定是做错了什么,或者这是一个 Marmalade 特有的问题。 我打算把我的库放到它确实查看的文件夹里,看看能否解决。
另一个让我困惑的事情是,参数 -l 和 python 之间没有空格。
1> c:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/bin/ld.exe: 找不到 -lC:/Marmalade/7.2/s3e/lib/arm/python_d.a
编辑: 错误 1 错误:ld 返回 1 退出状态 collect2.exe 是一个链接器问题。
1> Build started: Project: RunPython_vc11x, Configuration: GCC ARM Debug Win32
1> ARM Compiling(GCC) c:\python_compile\RunPython.cpp ...
1> ARM Linking(GCC) ...
1> c:/marmalade/7.2/s3e/gcc/win32/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/bin/ld.exe: cannot find -llibpython_d
1>collect2.exe : error : ld returned 1 exit status
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我通过在属性中添加我的库目录解决了这个问题(用 / 而不是 \,这有点反直觉):
C/C++ >常规> 额外包含目录:使用 c:/.../lib/arm(而不是 C:...\lib\arm) 链接器>常规> 额外包含目录:使用 c:/.../lib/arm(而不是 C:...\lib\arm) 链接器>输入> 额外依赖项:libpython_d.a
编辑:之前我在 Visual Studio 中遇到“参数太多”的问题,但我发现这只是需要回去查看 Python 头文件,以确保我的外部数据类型与库函数的数据类型匹配。
1 个回答
我搞明白了,marmalade中间件在链接的时候,会在前面加上“lib”,后面加上“_d.a”。所以只需要引用“library”,比如说用lib"library"_d.a。
MKB:
files
{
RunPython.cpp
}
librarys
{
<arm_shared>
"../python-master,python"
}
includepaths
{
../pythonMaster/
../pythonMaster/upstream/Python
../pythonMaster/upstream/Include
}
ROOTFOLDER
+-- lib
+-- arm
| +-- libBASENAME.a
| +-- libBASENAME_d.a
| +-- v5
| +-- libBASENAME.a
| +-- v6
| +-- libBASENAME.a
| +-- vfp
| |-- libBASENAME.a
+-- x86
+-- libBASENAME.lib
+-- libBASENAME_d.lib
+-- darwin
+-- libBASENAME.lib
+-- libBASENAME_d.lib