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

Posted

技术标签:

【中文标题】使用 MXE - GSL 链接在 Linux for Windows 上进行交叉编译?【英文标题】:Cross compiling on Linux for Windows using MXE - GSL linking? 【发布时间】:2013-03-07 15:20:42 【问题描述】:

我有一个在 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 文件吗?或者在那种情况下我应该让我的同事在他们的机器上重新编译?

感谢您能给我的任何帮助!

【问题讨论】:

【参考方案1】:

问题是目前(2016 年 11 月)将 gsl 编译为共享库在 mxe 中已停用。这就是为什么您的链接器找不到对这些函数的引用而您收到此错误的原因。

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

由于我自己的项目需要 gsl,因此我尝试在对 mxe (https://github.com/mxe/mxe/pull/1568) 的拉取请求中启用共享构建。你可以试试这个修改的运气,它确实对我有用。

【讨论】:

我检查了,提交已经合并了,不错!【参考方案2】:

对于 diganose,我建议如下

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

    提供完整的错误日志

    使用一些二进制探索工具,如“objdump”(可能它位于 MXE 构建的 mingw 文件夹下,类似“i686-pc-mingw32-objdump”)来查看您构建的库并查看如果它们包含缺少的符号。

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

是的,像 cmake 或 qmake 这样的构建系统可能会使事情变得更容易,尽管每次使用构建系统时,您都必须首先了解很多关于构建系统的知识。

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

祝你好运!

【讨论】:

以上是关于使用 MXE - GSL 链接在 Linux for Windows 上进行交叉编译?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nvidia Nsight eclipse 中使用 GNU 科学库 (gsl)

在 CMakeLists.txt 中链接 GSL

gsl安装(Linux系统)

使用 MXE gcc 构建 Qt 应用程序时缺少 std::mutex

Linux 安装GSL库至指定目录

gsl_rng_default 未解决的外部错误