2013-03-07 127 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

相关问题