質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

Q&A

解決済

1回答

965閲覧

MinGWを用いてlibcmaesがコンパイルできません

hg-glim

総合スコア1

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

0グッド

0クリップ

投稿2020/11/19 14:05

編集2020/11/20 01:30

現在VirtualBox上のUbuntuでlibcmaesを用いたC++のプログラムを作成しています.
ubuntu上で動作するまでは至ったのですが,わけあってWindows上で動かすことになりました.
そこでクロスコンパイルのためにmingw-w64を入れてみたのですがリンクエラーが出てしまいます.
問題なくコンパイルするためにはどうすればいいのかご教授お願い致します.

g++では問題なくコンパイルできますが,コマンドをx86_64-w64-mingw32-g++に置き換えると以下のようなエラーが出ます.

$ 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 /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

以下にソースコードを記載します.
実際に取り組んでいるものとは違いますが,libcmaesのサンプルコードを簡略化したものでも同様のエラーでしたのでそちらを記載します.

#include <iostream> #include <cmaes.h> using namespace libcmaes; int main() { int dim = 10; // problem dimensions. std::vector<double> x0(dim,20.0); double sigma = 0.1; CMAParameters <> cmaparams(x0,sigma); return 0; }

追記:
実行時のコマンドでmingw内のincludeやlibを指定できていなかったので修正しました.
ですが,結果に変化はありませんでした.

$ sudo x86_64-w64-mingw32-g++ -fopenmp -I/usr/x86_64-w64-mingw32/include/eigen3 -I/usr/x86_64-w64-mingw32/include/libcmaes -L/usr/x86_64-w64-mingw32/lib -static-libstdc++ -static-libgcc -std=c++11 -o output.exe source.cpp -lcmaes

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まずcross-compile環境を整えました。cmakeはもともと入れていたので割愛しました。

sudo apt install g++-mingw-w64-x86-64

次に、
https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/cross_compiling/Mingw
に従ってtoolchanin-x86_64-mingw32.cmakeを次のように作成しました。

cmake

1# the name of the target operating system 2SET(CMAKE_SYSTEM_NAME Windows) 3# which compilers to use for C and C++ 4SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) 5SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) 6SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) 7# here is the target environment located 8SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32 /home/yumetodo/mingw-install ) 9# adjust the default behaviour of the FIND_XXX() commands: 10# search headers and libraries in the target environment, search programs in the host environment 11set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 12set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 13set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

libcmaesと依存パッケージを次のようにして導入しました。

bash

1git clone https://gitlab.com/libeigen/eigen.git -b 3.3 2cd eigen 3mkdir build 4cd build 5cmake -DCMAKE_TOOLCHAIN_FILE=~/toolchanin-x86_64-mingw32.cmake -DCMAKE_INSTALL_PREFIX=/home/yumetodo/mingw-install .. 6make install 7cd ~ 8git clone https://github.com/google/glog.git -b v0.4.0 --depth=1 9cd glog 10mkdir build 11cd build 12cmake -DCMAKE_TOOLCHAIN_FILE=~/toolchanin-x86_64-mingw32.cmake -DCMAKE_INSTALL_PREFIX=/home/yumetodo/mingw-install .. 13cmake --build . 14make install 15cd ~ 16git clone https://github.com/gflags/gflags.git -b v2.2.2 --depth=1 17cd gflags 18mkdir build 19cd build 20cmake -DCMAKE_TOOLCHAIN_FILE=~/toolchanin-x86_64-mingw32.cmake -DCMAKE_INSTALL_PREFIX=/home/yumetodo/mingw-install .. 21make -j2 22make install 23cd ~ 24git clone https://github.com/beniz/libcmaes.git -b 0.9.6.1 --depth=1 25cd libcmaes 26mkdir build 27cd build 28cmake -DCMAKE_TOOLCHAIN_FILE=~/toolchanin-x86_64-mingw32.cmake -DCMAKE_INSTALL_PREFIX=/home/yumetodo/mingw-install .. 29make -j4 30make install

それからご提示のソースファイルをsrc.cppとして手元に作成し、同じdirectoryにbuild.shとして以下を作成しました。

bash

1#!/bin/bash 2export PKG_CONFIG_LIBDIR=~/mingw-install/share/pkgconfig/:~/mingw-install/lib/pkgconfig/ 3pkg-config --cflags --libs libcmaes eigen3 4x86_64-w64-mingw32-g++ src.cpp -o foo `pkg-config --cflags --libs libcmaes eigen3`
$ chmod +x build.sh $ ./build.sh -fPIC -std=c++11 -fopenmp -I/home/yumetodo/mingw-install/include/eigen3 -I/home/yumetodo/mingw-install/include/libcmaes -L/home/yumetodo/mingw-install/lib -lcmaes

つまるところlib指定が良くないということではないでしょうか。

投稿2020/11/20 06:07

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hg-glim

2020/11/23 08:39

返信遅くなってしまい申し訳ありません.解説いただいた内容を基にCMakeの導入からなぞっていって無事解決しました!libで指定したlibcmaes.aをmingw32でビルドできていなかったのが一番の原因で,CMakeでコンパイラ指定したのが一番の解決だったみたいです.導入に始まり過程と仔細をくださったことが本当に助かりました,お世話になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問