用mingw编译libcmaes
Compile libcmaes with mingw
我正在尝试使用 Ubuntu 20.04.1(Windows 主机上的虚拟机)创建一个 windows .exe 文件。
源代码包含 libcmaes,所以我可以用 sudo x86_64-w64-mingw32-g++ -fopenmp -I/usr/include/eigen3 -I/usr/include/libcmaes -L/usr/lib -std=c++11 -o output.exe source.cpp -lcmaes
编译以下代码,生成的文件在 ubuntu 上运行良好。
但是当 g++
被替换 x86_64-w64-mingw32-g++
并且终端返回错误时我无法编译它。
我从libcmaes示例代码中注释掉了一点,发现它可能没有链接。
这是代码和错误内容。
代码
#include <iostream>
#include <cmaes.h>
using namespace libcmaes;
FitFunc object = [](const double *x, const int N)
{
double val = 0;
for (int i=0;i<N;i++)
val += x[i];
return val;
};
int main()
{
int dim = 10; // problem dimensions.
std::vector<double> x0(dim,20.0);
double sigma = 0.1;
CMAParameters <> cmaparams(x0,sigma);
//cmaparams.set_algo(BIPOP_CMAES);
//CMASolutions cmasols = cmaes<>(object,cmaparams);
//std::cout << "best solution: " << cmasols << std::endl;
//std::cout << "optimization took " << cmasols.elapsed_time() / 1000.0 << " seconds\n";
//return cmasols.run_status();
return 0;
}
结果
/usr/bin/x86_64-w64-mingw32-ld: /tmp/cc67KYiT.o:finish.cpp:(.text+0x146): undefined reference to `libcmaes::CMAParameters<libcmaes::GenoPheno<libcmaes::NoBoundStrategy, libcmaes::NoScalingStrategy> >::CMAParameters(std::vector<double, std::allocator<double> > const&, double const&, int const&, unsigned long long const&, libcmaes::GenoPheno<libcmaes::NoBoundStrategy, libcmaes::NoScalingStrategy> const&)'
/usr/bin/x86_64-w64-mingw32-ld: /tmp/cc67KYiT.o:finish.cpp:(.text+0x166): undefined reference to `libcmaes::CMAParameters<libcmaes::GenoPheno<libcmaes::NoBoundStrategy, libcmaes::NoScalingStrategy> >::~CMAParameters()'
collect2: error: ld returned 1 exit status
请告诉我应该怎么做。
您在 Linux 上为 Windows 交叉编译,所以 -L/usr/lib
在使用 MinGW 时是错误的,因为它指向 Ubuntu 库,而不是 Windows 图书馆。
相反,您应该确保 -I
和 -L
指向您的 Windows 构建的 libsmaes。
我正在尝试使用 Ubuntu 20.04.1(Windows 主机上的虚拟机)创建一个 windows .exe 文件。
源代码包含 libcmaes,所以我可以用 sudo x86_64-w64-mingw32-g++ -fopenmp -I/usr/include/eigen3 -I/usr/include/libcmaes -L/usr/lib -std=c++11 -o output.exe source.cpp -lcmaes
编译以下代码,生成的文件在 ubuntu 上运行良好。
但是当 g++
被替换 x86_64-w64-mingw32-g++
并且终端返回错误时我无法编译它。
我从libcmaes示例代码中注释掉了一点,发现它可能没有链接。 这是代码和错误内容。
代码
#include <iostream>
#include <cmaes.h>
using namespace libcmaes;
FitFunc object = [](const double *x, const int N)
{
double val = 0;
for (int i=0;i<N;i++)
val += x[i];
return val;
};
int main()
{
int dim = 10; // problem dimensions.
std::vector<double> x0(dim,20.0);
double sigma = 0.1;
CMAParameters <> cmaparams(x0,sigma);
//cmaparams.set_algo(BIPOP_CMAES);
//CMASolutions cmasols = cmaes<>(object,cmaparams);
//std::cout << "best solution: " << cmasols << std::endl;
//std::cout << "optimization took " << cmasols.elapsed_time() / 1000.0 << " seconds\n";
//return cmasols.run_status();
return 0;
}
结果
/usr/bin/x86_64-w64-mingw32-ld: /tmp/cc67KYiT.o:finish.cpp:(.text+0x146): undefined reference to `libcmaes::CMAParameters<libcmaes::GenoPheno<libcmaes::NoBoundStrategy, libcmaes::NoScalingStrategy> >::CMAParameters(std::vector<double, std::allocator<double> > const&, double const&, int const&, unsigned long long const&, libcmaes::GenoPheno<libcmaes::NoBoundStrategy, libcmaes::NoScalingStrategy> const&)'
/usr/bin/x86_64-w64-mingw32-ld: /tmp/cc67KYiT.o:finish.cpp:(.text+0x166): undefined reference to `libcmaes::CMAParameters<libcmaes::GenoPheno<libcmaes::NoBoundStrategy, libcmaes::NoScalingStrategy> >::~CMAParameters()'
collect2: error: ld returned 1 exit status
请告诉我应该怎么做。
您在 Linux 上为 Windows 交叉编译,所以 -L/usr/lib
在使用 MinGW 时是错误的,因为它指向 Ubuntu 库,而不是 Windows 图书馆。
相反,您应该确保 -I
和 -L
指向您的 Windows 构建的 libsmaes。