[解決済み] 静的にリンクされたライブラリでGCCのリンク時最適化を使用する
質問
リンク時の最適化を行うために
-flto
フラグを使用しています。
私のコードでは問題なく動作しますが、私がビルドして私のプロジェクトとリンクしている静的リンクライブラリとリンクしません(これは エンジン で、ライブラリは glsl-optimizer 参考までに)。
以下はその出力です。
...
/usr/bin/ranlib: ir_expression_flattening.cpp.o: plugin needed to handle lto object
/usr/bin/ranlib: opt_function_inlining.cpp.o: plugin needed to handle lto object
/usr/bin/ranlib: opt_copy_propagation_elements.cpp.o: plugin needed to handle lto object
...
そしてその後、もちろん、いくつかの関数へのいくつかの "undefined references" が表示されます。
いろいろと調べてみると、もしかしたらその原因は
ar
を使用するようにします。
gcc-ar
でも、どうしたらいいのかわからない。
また、私はltoをサポートしていないCMakeを使っています(一部のプラットフォームではIntelのコンパイラを除く、とのことですが...)。それでも、私は使用してみました。
set_property(TARGET glsl_optimizer PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
というのはうまくいかなかった。
また、試しに GCC の
-fuse-linker-plugin
というフラグを立てますが、これはうまくいきませんでした。
昔ながらの方法で、直接
gcc-ar
それとも、何か他の方法があるのでしょうか?
どのように解決するのですか?
ここに MCVE この問題を再現したCMakeプロジェクト。
$ ls -R hellow
hellow:
CMakeLists.txt hello.c libhello.c
$ cat hellow/CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project (hellow)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto")
#SET(CMAKE_AR "gcc-ar")
#SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qcs <TARGET> <LINK_FLAGS> <OBJECTS>")
#SET(CMAKE_C_ARCHIVE_FINISH true)
add_library(hello STATIC libhello.c)
add_executable(hellow hello.c)
target_link_libraries(hellow hello)
add_dependencies(hellow hello)
$ cat hellow/hello.c
extern void hello(void);
int main(void)
{
hello();
return 0;
}
$ cat hellow/libhello.c
#include <stdio.h>
void hello(void)
{
puts("Hello");
}
コンフィギュレーションは良好です。
$ mkdir build_hellow
$ cd build_hellow/
$ cmake ../hellow
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/imk/dev/so/build_hellow
問題通り、ビルドに失敗しました。
$ make
Scanning dependencies of target hello
[ 25%] Building C object CMakeFiles/hello.dir/libhello.c.o
[ 50%] Linking C static library libhello.a
/usr/bin/ar: CMakeFiles/hello.dir/libhello.c.o: plugin needed to handle lto object
/usr/bin/ranlib: libhello.c.o: plugin needed to handle lto object
[ 50%] Built target hello
Scanning dependencies of target hellow
[ 75%] Building C object CMakeFiles/hellow.dir/hello.c.o
[100%] Linking C executable hellow
/tmp/ccV0lG36.ltrans0.ltrans.o: In function `main':
<artificial>:(.text+0x5): undefined reference to `hello'
collect2: error: ld returned 1 exit status
CMakeFiles/hellow.dir/build.make:95: recipe for target 'hellow' failed
make[2]: *** [hellow] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/hellow.dir/all' failed
make[1]: *** [CMakeFiles/hellow.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
解決策は1つではありません。ひとつは、コメントされている3行をアンコメントすることです。
で
CMakeLists.txt
上記の では
$ cmake ../hellow/
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/imk/dev/so/build_hellow
$ make
Scanning dependencies of target hello
[ 25%] Building C object CMakeFiles/hello.dir/libhello.c.o
[ 50%] Linking C static library libhello.a
[ 50%] Built target hello
Scanning dependencies of target hellow
[ 75%] Building C object CMakeFiles/hellow.dir/hello.c.o
[100%] Linking C executable hellow
[100%] Built target hellow
$ ./hellow
Hello
この修正は、以下の事実を利用したものです。
ビルドブレーキング問題。
/usr/bin/ar: CMakeFiles/hello.dir/libhello.c.o: plugin needed to handle lto object
...
/usr/bin/ranlib: libhello.c.o: plugin needed to handle lto object
を与えることで解決できます。
ar
と
ranlib
を選択します。
--plugin=$(gcc --print-file-name=liblto_plugin.so)
しかし、GNU
ranlib
の同義語に過ぎません。
ar -s
であり
gcc-ar
は
のラッパーです。
ar
で、そのプラグインを供給しています。
C言語のスタティック・ライブラリに対するCMakeのビルド・テンプレートは。
CMAKE_C_ARCHIVE_CREATE ( = <CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>)
CMAKE_C_ARCHIVE_FINISH ( = <CMAKE_RANLIB> <TARGET>)
GNUの場合は
ar
が相当します。
CMAKE_C_ARCHIVE_CREATE ( = <CMAKE_AR> qcs <TARGET> <LINK_FLAGS> <OBJECTS>)
CMAKE_C_ARCHIVE_FINISH ( = true) # Or any other no-op command
ということで、これらの設定にプラスして
SET(CMAKE_AR "gcc-ar")
私たちは大丈夫です。
C++プロジェクトの場合は、もちろん
CMAKE_CXX_ARCHIVE_CREATE
と
CMAKE_CXX_ARCHIVE_FINISH
関連
-
[解決済み】g++ output: file not recognized: ファイル形式が認識されない
-
[解決済み] gcc エラー : `itoa' への未定義の参照
-
[解決済み] 警告: 異なるサイズの整数への/からのポインタへのキャスト
-
[解決済み] gccのオプションにある-m32、-m64、nothingの違いは何ですか?
-
[解決済み] LD_LIBRARY_PATH と LIBRARY_PATH の比較
-
[解決済み] LLVMとは何ですか?
-
[解決済み】GCCのプリプロセッサー定義のダンプ
-
[解決済み】-Wl,-rpath -Wlがわかりません。
-
[解決済み] ビルドターゲットの外にgccのデバッグシンボルを生成する方法は?
-
[解決済み] CMakeに新しいGCCのパスを指定する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] gcc エラー : `itoa' への未定義の参照
-
[解決済み] .ascizと.stringアセンブラディレクティブの違いは何ですか?
-
[解決済み] 警告: 異なるサイズの整数への/からのポインタへのキャスト
-
[解決済み] シグナル11[SIGSEGV]のデフォルトアクションでプロセスが終了しています。
-
configure: エラー: $PATH に受け入れ可能な C コンパイラがありません。
-
[解決済み] CFLAGS, CCFLAGS, CXXFLAGS - これらの変数はいったい何を制御しているのでしょうか?
-
[解決済み] LLVMとは何ですか?
-
[解決済み】-Wl,-rpath -Wlがわかりません。
-
[解決済み] ビルドターゲットの外にgccのデバッグシンボルを生成する方法は?
-
[解決済み] ライブラリを静的にリンクするようにgccに直接指示する