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