Python-Solvespace編譯除錯中。

Netbeans的版次管理與自訂工具列 :

Netbeans有內建檔案版本紀錄的功能,只要在檔案左上角的按鈕切換到History,就會出現修改紀錄表。

點擊其中的項目就會顯示並和目前版本的檔案做比較。

其中紅色是刪除;綠色是新增;藍色是取代。

如果想復原其中的項目,可以移到顏色區塊上,左側的版本會出現箭頭,能夠將舊版的內容復原至當前的區段中,十分方便。

若是想直接復原整個檔案,可以在紀錄上案右鍵,選擇Revert from History就會復原檔案。特別的是,一但復原檔案,Netbeans就會直接儲存檔案,成為新的歷史紀錄,這方面需要多注意。

而專案中的檔案名稱也會配上顏色,不論是在左側的檔案樹或是分頁上。

黑色是一般clone下來的專案;藍色是使用者修改過的檔案(縱使已經復原到原始版本);灰色是透過MinGW以外程式編寫的檔案;綠色是自己撰寫或是由MinGW編譯出的檔案。

Netbeans是以Git功能為基礎架設的(雖然不一定要使用),因此十分注重版次管理,也支援圖形化顯示git pull的修改處。

另一個個人化的功能就是自訂工具列,能夠將內建或模組的功能鈕設置在工具列上。

排列方法跟Firefox一樣是抓取的。


上次的問題 :

上一篇網誌中的問題:

Icons

Netbeans找不到外部程式的問題已解決,只要指定程式的確切位置就能執行。

所以指定Perl在W:槽的位置,上次發現的Perl其實是MinGW的附加工具,版本是5.8。

但是新下載的是5.24,並且有安裝需要的模組"GD"。

修改成下面這段:

PERL = W:\Perl524\bin\perl.exe

...

$(OBJDIR)/icons.h: png2c.pl icons/*
    @echo icons
    $(PERL) $< $@ $(OBJDIR)/icons-proto.h

指定後就可以執行。

而後來又有一個"rc"的指令:

$(RES): win32/$(@B).rc icon.ico
    rc win32/$(@B).rc
    mv win32/$(@B).res $(OBJDIR)/$(@B).res

(原始版本的錯誤用法$(@B)應該為$(@F),都改為$<或$^較明瞭)

經查詢資料,"rc.exe"原是Windows Kits的一個工具。

所以就改寫用變數指定。

RC = "C:\Program Files (x86)\Windows Kits\$(RCVER)\bin\$(RCBIT)\rc.exe"
RCVER = 10
RCBIT = x64

...

$(RES): resource.rc icon.ico
    @echo RES
    $(RC) $<
    mv win32/resource.res  $@

同理,其他如SWIG都可以呼叫所在位置來執行了。

ld.exe does not find libraries

要改一下語法,之前使用的-lslvs應該指定名稱-l:libslvs.so並指定同目錄:

cdemo: CDemo.c libslvs.so
    @echo cdemo
    @$(CXX) $(CFLAGS) -o $@ $< -L. -l:libslvs.so $(LIBS)

接著就能夠找到libslvs.so。

不知道是因為沒有-L指定目錄還是-l不會看附檔名的關係,一定要標定到檔案才會容許。


錯誤紀錄 :

已解決

Function "vasprintf"

在"slvs_python.hpp"中,導入了一個stdio.h的函式vasprintf

不過其實正確名稱應該要增加父項式,因此修改成__mingw_vasprintf(&buf, fmt, args)就沒問題了。

Netbeams應該是支援h++的標頭檔,但是"slvs_python.hpp"的前半段錯誤累累,應該是從屬關係和宣告的部分沒弄清楚。

目前並沒有干擾MinGW的編譯,但是這些東西應該重新整理一下,尤其是下面的導入:

#include <string>
#include <exception>

在編寫時好像連結不到,但是編譯時MinGW抓得到,不知道Netbeams的錯誤有沒有算入這種情形。

CMath

用SWIG剛轉出"slvs_wrap.cxx"時產生的問題。

出現一段錯誤:error: '::hypot' has not been declared

在其他人的commit中有解答:

https://github.com/casadi/casadi/issues/622

是說要新增include <cmath>進"slvs_wrap.cxx"中,而且必須在"Python.h"之前。

所以我就在interface檔中新增了,讓轉換時會自動加入這段。

不過這個問題是暫時解決,後來又有相關的麻煩。

未解決

分成兩部分的Makefile,主要是exposed資料夾的python函式比較重要。

Solvespace Makefile

在最後一個要生成"solvespace.exe"時無法辨識.obj檔案?

g++ -D_WIN32_WINNT=0x500 -DISOLATION_AWARE_ENABLED -D_WIN32_IE=0x500 -DWIN32_LEAN_AND_MEAN -DWIN32 -g -m32 -MT -Iextlib -I..\common\win32 -I. -D_DEBUG -D_CRT_SECURE_NO_WARNINGS   obj/ratpoly.obj ... obj/resource.res -o obj/solvespace.exe
w:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/6.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe:obj/ratpoly.obj: file format not recognized; treating as linker script
w:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/6.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe:obj/ratpoly.obj:1: syntax error
collect2.exe: error: ld returned 1 exit status
make.exe": *** [obj/solvespace.exe] Error 1

目前還不知道怎麼辦,因為不太了解.o.obj的關係。

前者是暫時等待編譯的物件,後者是給記憶體參照的。

gcc對於副檔名是很重視的,可能要調整參數之類的?

Exposed Makefile

剩下幾步可以編成"slvs_wrap.o"。

最後跳出的錯誤,竟然是內建資料庫的問題。

In file included from W:/Anaconda3/include/Python.h:8:0,
                 from slvs_wrap.cxx:14:
W:/Anaconda3/include/pyconfig.h:262:15: error: 'std::_hypot' has not been declared
 #define hypot _hypot
               ^
make.exe": *** [../obj/slvs_wrap.o] Error 1

導入"Python.h"和相關的"pyconfig.h"時出現了錯誤。是從上面cmath衍生的問題。

上網搜尋了一下,好像找不到解決方法,'std::_hypot' has not been declared好像有出現在MinGW的Bug紀錄中。


這兩個Makefile的使用參數大相逕庭,以下是比較:

Solvespace

DEFINES = -D_WIN32_WINNT=0x500 -DISOLATION_AWARE_ENABLED -D_WIN32_IE=0x500 -DWIN32_LEAN_AND_MEAN -DWIN32
CFLAGS = -g -m32 -MT -Iextlib -I..\common\win32 -I. -D_DEBUG -D_CRT_SECURE_NO_WARNINGS

Exposed

WIN_DEFINES = -D_WIN32_WINNT=0x500 -D_WIN32_IE=0x500 -DWIN32_LEAN_AND_MEAN
DEFINES = -DISOLATION_AWARE_ENABLED -DLIBRARY
CFLAGS  = -I../extlib -I../../common/win32 -I. -I.. -D_DEBUG -D_CRT_SECURE_NO_WARNINGS -O2 -g -Wno-write-strings -fpermissive
CFLAGS_SHARED = -fPIC -shared $(CFLAGS)

兩個Makefile編譯階段都進入整合階段,剩下的一些編譯問題主要是對MinGW的編譯程式不熟悉的緣故。

像是一般的.so.o都較為廣用,可是將obj檔直接轉換成可執行檔,卻找不到範例。

之後要再找找看gcc和g++的編譯範例。


Comments

comments powered by Disqus