2

我有一个在 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是更清洁的解决方案吗?我可以用它.exe从我的 Linux 机器上创建一个文件吗?或者在那种情况下我应该让我的同事在他们的机器上重新编译?

谢谢你能给我的任何帮助!

4

2 回答 2

1

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

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

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

于 2016-11-11T11:04:03.317 回答
0

对于 diganose,我建议以下

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

  2. 提供完整的错误日志

  3. 使用一些二进制探索工具,如“objdump”(可能它位于 MXE 构建的 mingw 文件夹下,位于“i686-pc-mingw32-objdump”之类的东西下)查看您构建的库,看看它们是否包含丢失的符号.

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

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

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

祝你好运!

于 2014-03-16T20:56:35.710 回答