Cmakeでは、実行可能ファイルとライブラリの両方にいくつかの一般的なフラグを適用したいと思います。公開フラグはライブラリには適用されません(cmake)
私はtarget_compile_optionsをPUBLICキーワードを使って使用できると考えました。私は実行可能ファイルと静的ライブラリの両方で小さなファイル(main.c & mylib.c)を1つしか持たない小さなサンプルでテストしましたが、期待通りに動作しません。
CMakeLists.txtは次のようになりますルート:
cmake_minimum_required(VERSION 3.0)
# Add the library
add_subdirectory(mylib)
# Create the executable
add_executable(mytest main.c)
# Link the library
target_link_libraries(mytest mylib)
# Add public flags
target_compile_options(mytest PUBLIC -Wall)
とライブラリのCMakeLists.txt:
cmake_minimum_required(VERSION 3.0)
add_library(mylib STATIC mylib.c)
フラグ-Wallだけのmain.cに適用されていませんライブラリファイル(mylib.c)のファイル:
[ 25%] Building C object mylib/CMakeFiles/mylib.dir/mylib.c.o
cd /patsux/Programmation/Repositories/test-cmake-public/build/mylib && /usr/lib/hardening-wrapper/bin/cc -o CMakeFiles/mylib.dir/mylib.c.o -c /patsux/Programmation/Repositories/test-cmake-public/mylib/mylib.c
[ 50%] Linking C static library libmylib.a
[ 25%] Building C object CMakeFiles/mytest.dir/main.c.o
/usr/lib/hardening-wrapper/bin/cc -Wall -o CMakeFiles/mytest.dir/main.c.o -c /patsux/Programmation/Repositories/test-cmake-public/main.c
ここで、If実行可能ファイルの代わりにライブラリにフラグが適用されます。
# Add public flags on the library
target_compile_options(mylib PUBLIC -Wall)
は私が取得:ようなライブラリのターゲットのタイプとして一般的なフラグを設定しても意味がありません
[ 25%] Building C object mylib/CMakeFiles/mylib.dir/mylib.c.o
cd /patsux/Programmation/Repositories/test-cmake-public/build/mylib && /usr/lib/hardening-wrapper/bin/cc -Wall -o CMakeFiles/mylib.dir/mylib.c.o -c /patsux/Programmation/Repositories/test-cmake-public/mylib/mylib.c
[ 50%] Linking C static library libmylib.a
[ 75%] Building C object CMakeFiles/mytest.dir/main.c.o
/usr/lib/hardening-wrapper/bin/cc -Wall -o CMakeFiles/mytest.dir/main.c.o -c /patsux/Programmation/Repositories/test-cmake-public/main.c
[100%] Linking C executable mytest
を。
どのようにして一般的なフラグを正しく共有できますか?私はadd_definitions()を使用できることを知っています。それは正しい方法ですか?
私も試験:
set_target_properties(mytest PROPERTIES COMPILE_FLAGS -Wall)
しかし、フラグはパブリックではありません。
はい:あなたが3.0より前cmakeのバージョンを使用していた場合
または、。おそらく** add_compile_options()**を使ってCとC++コンパイラの両方にフラグを適用します。 – Patsux
私はadd_compile_options()について知らなかった。そうです、それはより良い選択です。私は自分の答えを編集する – wasthishelpful