Visual Studio, Marmalade C++:在ARM上导入libpython.a并运行嵌入式解释器中的Python代码

1 投票
1 回答
587 浏览
提问于 2025-04-18 06:02

我正在尝试在嵌入式解释器中运行 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 头文件,以确保我的外部数据类型与库函数的数据类型匹配。

C++ 外部函数错误:参数太多

1 个回答

0

我搞明白了,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

撰写回答