サードパーティのライブラリを静的リンクした自作のライブラリを 静的 or 動的 リンクして利用したい
サードパーティを静的リンクした(はずの)自作のライブラリがあります。
これをまた別のプログラムにリンクしようとしたときに、
リンクエラーが発生します。
コンパイルとライブラリの生成コマンド
※オプジェクトがたくさんあるので抜粋
$ g++ -w -O3 -std=c++1z -m64 -static -static-libstdc++ -I/usr/local/include -c calc.cpp -o calc.o -L/usr/local/lib -lopenblas -lm -lpthread $ ar r libmylib.a calc.o
生成されたオブジェクトの中身
上記で静的リンクされたライブラリが生成される認識なのですが、
オブジェクトの中身の確認するとサードパーティのライブラリの関数が、
Undefine(U cblas_dgemm
)になっているように見えます。
$ nm libmylib.a calc.o: 0000000000000000 r .LC0 0000000000000000 V DW.ref.__gxx_personality_v0 U _GLOBAL_OFFSET_TABLE_ 0000000000000000 t _GLOBAL__sub_I__ZN2la4blas4calc3dotERKNS_3MtxES4_ U _Unwind_Resume U _ZN2la3Mtx3mtxERKmS2_ U _ZN2la3MtxD1Ev 0000000000000000 T _ZN2la4blas4calc3dotERKNS_3MtxES4_ U _ZNSt8ios_base4InitC1Ev U _ZNSt8ios_base4InitD1Ev 0000000000000000 b _ZStL8__ioinit U __cxa_atexit U __dso_handle U __gxx_personality_v0 U __stack_chk_fail U cblas_dgemm
実際のソースコードは下記
#include "lapt/3rdparty/blas/calc.hpp" #include <cblas.h> using namespace std; using namespace la; using namespace la::blas; Mtx calc::dot(const Mtx &a, const Mtx &b) { Mtx m = Mtx::mtx(a.rows, b.cols); #ifdef LVAL_DBL cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m.rows, m.cols, a.cols, 1.0, a.p, a.cols, b.p, b.cols, 0.0, m.p, m.cols); #else cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m.rows, m.cols, a.cols, 1.0, a.p, a.cols, b.p, b.cols, 0.0, m.p, m.cols); #endif return m; }
発生している問題・エラーメッセージ
そのライブラリを別のプログラムにリンクしようとすると、
案の定リンクエラーが発生します。
$ g++ -o main main.o -lmylib ~~~ libmylib.a(calc.o): In function `la::blas::calc::dot(la::Mtx const&, la::Mtx const&)': calc.cpp:(.text+0x6c): undefined reference to `cblas_dgemm' ~~~
おそらくサードパーティを自作のライブラリにリンクする時点で、
静的リンクができていないのではないかと思っておりますが、
何か不足している処理やコマンドのミスがあるのでしょうか?
静的リンクをすると、そのリンク元のオブジェクトが無くとも、
別のプログラムで利用できるという認識でいるのですが、
そもそもその認識が間違いでしょうか?
なにか良いデバッグ方法などありましたら、
ご教授いただけますと幸いです。
補足情報
$ g++ --version g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ ar --version GNU ar (GNU Binutils for Ubuntu) 2.30 Copyright (C) 2018 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) any later version. This program has absolutely no warranty.
解決方法
自己解決ではない場合の解決方法をどこに書いたらいいかわからないのでここに書きますが、@Chironianさんの「①サード・パーティのライブラリと自作ライブラリをあらためてアーカイブする」で解決しました。
$ ar -M AR >create libmylib.a # 出力するアーカイブ名 AR >addlib libmylib.a # 自作ライブラリのアーカイブを追加 AR >addlib /usr/local/lib/libopenblas.a # サードパーティのアーカイブを追加 AR >save AR >end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/29 13:02