2013-03-07 180 views
2

我有一個在Linux上開發的C++項目,我想通過給他們的可執行文件傳遞給我的Windows用戶同事。使用MXE在Linux上進行交叉編譯 - GSL鏈接?

我搜索了這個問題,發現有一種方法可以通過使用i586-mingw32msvc-g++而不是g++進行編譯。我也明白這個解決方案會解決需要重建的鏈接庫的問題,我希望通過使用MXE腳本(http://mxe.cc/)來解決這個問題。

我的Makefile(我在這個新的建議,歡迎):

#main.make 
CC = i586-mingw32msvc-g++ 
CFLAGS = -Wall -O2 
LDFLAGS = 
SOURCES = <list of cpp files> 
LDLIBS = -L/usr/i586-mingw32msvc/lib/ -llapack -lblas -lgsl -lgslcblas -lm -lmingw32 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE = main_simple.exe 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] $(LDLIBS) 

.cpp.o: 
    $(CC) $(CFLAGS) -c $< 

clean: 
    rm *.o main_simple.exe ./Output/* ./Output/*/* ./Output/*/*/* 

如果我嘗試make我得到像一堆GSL相關的錯誤:

utilities.o:utilities.cpp:(.text+0x2d1): undefined reference to `_gsl_matrix_alloc' 
utilities.o:utilities.cpp:(.text+0x2dc): undefined reference to `_gsl_vector_alloc' 
.... 
utilities.o:utilities.cpp:(.text+0x42e): undefined reference to `_gsl_matrix_free' 
utilities.o:utilities.cpp:(.text+0x70f): undefined reference to `_gsl_fit_linear' 
utilities.o:utilities.cpp:(.text+0x722): undefined reference to `_gsl_stats_correlation' 
collect2: ld returned 1 exit status 

這是否意味着編譯器真的找到了我認爲我已經與MXE交叉構建的庫?我能做什麼?

或者,cmake會是一個更清潔的解決方案嗎?我可以用它從我的Linux機器創建一個.exe文件嗎?或者在這種情況下,我應該讓我的同事們在他們的機器上重新編譯?

謝謝你給我的任何幫助!

回答

0

要diganose,我建議以下

  1. 提供完整的「建立轉儲」實際的編譯器被調用和標誌被稱爲

  2. 提供完整的錯誤日誌

  3. 使用一些二進制探索工具,如'objdump'(也許它會在MXE下建立的mingw文件夾下,像'i686-pc-mingw32-objdump'之類的東西),以便進入你建立的庫中,看看它們是否包含mi選擇符號。

換句話說,如果你建立了應該有它裏面的`_gsl_matrix_alloc」函數庫,然後看你建立,以確保它的存在庫中。如果你不知道哪個庫應該包含該函數,那麼執行一些shell工作來搜索所有尋找該符號名稱的庫。

是的,像cmake或qmake這樣的構建系統可能會讓事情變得更容易,但是每次使用構建系統時,您都必須首先了解構建系統。

最後,最能幫助你的是找到另一個與你的程序庫相同的程序,並且你知道交叉編譯到windows,然後複製他們做的。這樣的程序的一個很好的來源是去mxe.cc並查看他們網頁上的'使用mxe'項目的項目,並查看他們中的任何一個是否使用GSL,然後看他們是如何做到的。另一種查找項目的方法是使用GSL查找開源項目,並查看他們是否在其主網頁上公佈了Windows二進制下載。如果是這樣,他們可能會使用交叉編譯。

祝你好運!

1

問題是,目前(2016年11月)在mxe中停用了gsl作爲共享庫的編譯。這就是爲什麼你的鏈接器找不到這些函數的引用,並且你得到這個錯誤。

您現在可以使用mxe交叉編譯器自己編譯gsl或激活共享編譯(查看mxe源代碼中的src/gsl.mk)。

由於我需要gsl爲我自己的項目,我試圖啓用共享的生成在拉請求mxe(https://github.com/mxe/mxe/pull/1568)。你可以試試這個修改的運氣,它對我有用。

+0

我檢查並提交已合併,很好! – crobar 2017-06-20 13:52:17

相關問題