使用MXE在Linux上进行交叉编译 – GSL链接?

我有一个在Linux上开发的C ++项目,我想通过给他们的可执行文件传递给我的Windows用户同事。

我search了这个问题,发现有一种方法可以通过使用i586-mingw32msvc-g++而不是i586-mingw32msvc-g++g++ 。 我也明白,这个解决scheme将解决需要重build的链接库的问题,我希望通过使用MXE脚本( http://mxe.cc/ )来解决这个问题。

我的生成文件是(我是新的,欢迎提出build议):

 #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 

这是否意味着编译器确实find了我认为我已经与MXE交叉构build的库? 我能做什么?

或者, cmake会是一个更清洁的解决scheme吗? 我可以用它从我的Linux机器上创build一个.exe文件吗? 或者在这种情况下,我应该问我的同事在他们的机器上重新编译?

谢谢你给我的任何帮助!

问题是,目前(2016年11月)在mxe中将gsl编译为共享库已停用。 这就是为什么你的链接器不能找到这些函数的引用,你会得到这个错误。

您现在可以使用mxe交叉编译器自己编译gsl,也可以激活共享编译(查看mxe源代码中的src / gsl.mk)。

因为我需要gsl为我自己的项目,我试图启用共享生成拉请求mxe( https://github.com/mxe/mxe/pull/1568 )。 你可以尝试你的运气,这个修改,它为我工作。

diganose,我会建议如下

  1. 提供被调用的实际编译器和被调用的标志的完整“构建转储”

  2. 提供完整的错误日志

  3. 使用一些像objdump这样的二进制探索工具(也许它会在MXE下建立的mingw文件夹下,像'i686-pc-mingw32-objdump'之类的东西),以便同步到你已经构建的库中,看看它们是否包含缺少的符号。

换句话说,如果你建立了一个库,里面应该有`_gsl_matrix_alloc'函数,那么看看你建立的库,确保它在那里。 如果您不知道哪个库应该包含该函数,那么执行一些shell工作来搜索所有查找该符号名称的库。

是的,像cmake或qmake这样的构建系统可能会让事情变得更容易,但是每次使用构建系统时,都必须首先了解构建系统。

最后,最能帮助你的是找到另一个与你的程序库相同的程序,并且你知道交叉编译到windows,然后复制他们所做的。 这样的程序的一个很好的来源是去mxe.cc,并看看他们的网页上的“项目使用mxe”列表,看看他们是否有任何使用GSL,然后看看他们是如何做到这一点。 另一种查找项目的方法是使用GSL查找开源项目,看看他们是否在其主网页上公布了Windows二进制下载。 如果是这样,他们很可能正在使用交叉编译。

祝你好运!