簡體   English   中英

使用MXE-GSL鏈接在Linux上的Windows上交叉編譯?

[英]Cross compiling on Linux for Windows using MXE - GSL linking?

我有一個在Linux上開發的C ++項目,我想通過向他們提供可執行文件的方式傳遞給Windows用戶同事。

我研究了這個問題,發現一種方法是使用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 $@ $(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文件嗎? 還是在那種情況下,我應該請我的同事在他們的計算機上重新編譯?

謝謝您能給我的任何幫助!

問題在於,當前(2016年11月)在mxe中停用了將gsl編譯為共享庫的功能。 這就是為什么您的鏈接器找不到對這些函數的引用,而您收到此錯誤的原因。

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

由於我需要為自己的項目使用gsl,因此我嘗試在對mxe( https://github.com/mxe/mxe/pull/1568 )的請求中啟用共享構建。 您可以通過此修改嘗試自己的運氣,它確實對我有用。

對於二甘蔗糖,我建議以下

  1. 提供正在調用的實際編譯器和正在調用的標志的完整“構建轉儲”

  2. 提供完整的錯誤日志

  3. 使用一些二進制探索工具,例如“ objdump”(也許它將在MXE構建的mingw文件夾下,例如“ i686-pc-mingw32-objdump”之類)進入已構建的庫,並查看它們是否包含缺少的符號。

換句話說,如果您構建了一個應該在其中包含`_gsl_matrix_alloc'函數的庫,那么請查看所構建的庫以確保該庫在那里。 如果您不知道哪個庫應包含該函數,請執行一些shell工作以搜索所有查找該符號名稱的庫。

是的,諸如cmake或qmake之類的構建系統可能會使事情變得更容易,盡管每次使用構建系統時,您都必須首先學習大量有關構建系統的知識。

最后,對您最有幫助的是,在那里找到另一個程序,該程序使用與您的庫相同的庫,並且您知道交叉編譯到Windows,然后將其復制。 此類程序的一個很好的來源是轉到mxe.cc並在其網頁中查看“使用mxe的項目”列表,然后查看是否有任何人使用GSL,然后查看它們是如何做到的。 查找項目的另一種方法是使用GSL查找開源項目,並查看它們是否在其主網頁上宣傳Windows二進制文件下載。 如果是這樣,很可能他們正在使用交叉編譯。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM