Visual Studio, Marmalde C++: импорт libpython.a, запуск кода Python во встроенном интерпретаторе под рукой
Я пытаюсь запустить код Python во встроенном интерпретаторе для устройств arm; Построен в визуальной студии 2012, используя мармеладную студию.
Я собрал свою архивную статическую библиотеку ссылок, libpython.a, и поместил в \lib\arm\libpython.a (и libpython_d.a)
Я скомпилировал библиотеки python для ARM, загрузка в 'libpython.a', кажется, работает нормально, "VS:intellisense" выдает мне ошибки, когда я указал неправильный тип данных аргумента функции extern. (это хорошо, значит что-то связано по крайней мере)
мой мармеладный файл сборки.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.
У меня отключена оптимизация всей программы
ОБНОВИТЬ:
Я переустановил свою среду разработки на новой 64-битной Windows-7 с установленной Visual Studio 2012 Express и мармеладом 7.2.
я добавил соответствующие ссылки в файл моего проекта; все еще получают: ошибка MSB6006: "link.exe" завершен с кодом 1.
я решил исследовать с помощью processmonitor: дерево процессов, чтобы увидеть каталоги, к которым он обращается во время выполнения (учитывая, что нужная мне библиотека находится в папке с именем "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"
какие-либо идеи относительно того, почему компоновщик инст даже смотрит в каталогах? должно быть что-то, что я делаю неправильно, или это особая проблема с мармеладом, я собираюсь попытаться поместить свою библиотеку в папки, в которые она смотрит, посмотреть, работает ли она
другая вещь, которая озадачивает, - то, что нет НИКАКОГО ПРОСТРАНСТВА между аргументами -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++> general> Дополнительные каталоги включения: с помощью c:/.../lib/arm (НЕ C:...\lib\arm) Linker>general> Дополнительные каталоги включения: с использованием c:/.../lib/arm (НЕ C:... \ lib \ arm) Линкер>input> дополнительные зависимости: libpython_d.a
РЕДАКТИРОВАТЬ: раньше у меня были проблемы с Visual Studio, говоря "функция слишком много аргументов", но я обнаружил, что это просто вопрос возврата к заголовочным файлам Python, чтобы сопоставить мой внешний тип данных с типом библиотечных функций.
Ошибка внешней функции C++: слишком много аргументов для работы
1 ответ
Разобрался, мармеладное промежуточное ПО, добавляет "lib" и добавляет "_d.a" при компоновке. так что просто ссылка "библиотека" ex, lib"библиотека" _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