1

リンクの順序が重要です。プログラムをコンパイルすると、次のことがわかりました。

gcc `pkg-config --cflags --libs gtk+-2.0` program.cpp -o program

これにより、多くのリンカ エラーが生成されます。「`_gtk_init_abi_check' への未定義の参照」などです。これは、ライブラリの前に入力ファイルを指定することで解決できます。

gcc program.cpp `pkg-config --cflags --libs gtk+-2.0` -o program

私の質問:

Cmake ファイルを使用しているときに、この性質の問題を修正するにはどうすればよいですか? 現在使用している簡単な cmake ファイルの内容を次に示します。

cmake_minimum_required(VERSION 2.6)

project(program)

add_executable(program
program.cpp
)

EXEC_PROGRAM(pkg-config ARGS --cflags --libs gtk+-2.0 
             OUTPUT_VARIABLE GTK2_PKG_FLAGS)
SET(GTK2_PKG_FLAGS CACHE STRING "GTK2 Flags" "${GTK2_PKG_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GTK2_PKG_FLAGS}")

a のcmake後に aを実行するmakeと、上記の最初の行と同じリンカ エラーが発生するので、リンカの問題が順序に厳密に関連していることがわかります。では、cmake ファイルで pkg-config を使用するときにリンクの順序を変更するにはどうすればよいですか? cmake ファイルの一部を並べ替えてみましたが、正しい順序が見つからないようです。

4

2 に答える 2

4

1 つの変数で .pc ファイルの -I 部分と -L 部分の両方を与えるコマンドで、両方の引数--cflagsを渡しました。--libs

message("${GTK2_PKG_FLAGS}")実行して内容を印刷してみてください。

したがって、target_link_libraries() を使用して完全な変数 $GTK2_PKG_FLAGS をリンクするのは賢明ではないかもしれません。

以下の手順を試すこともできます

    INCLUDE(FindPkgConfig)
    pkg_check_modules(GTK REQUIRED gtk+-2.0)  

#include  
    include_directories(${GTK_INCLUDE_DIRS})  

#link  
    link_directories(${GTK_LIBRARY_DIRS})  
    target_link_libraries(program ${GTK_LIBRARIES}) 

質問を参照

于 2013-08-02T04:12:23.760 に答える
2

あはは!多くの検索と試行錯誤の後、次の行をcmakeファイルに追加することで、最終的に機能するようになりましたCMakeLists.txt

target_link_libraries(program
${GTK2_PKG_FLAGS}
)

そして、user2618142の回答からのアドバイスのいくつかを使用して、改善しました。関数 pkg_check_modules() が何らかの理由で機能しません。私は取得Unknown CMake command "pkg_check_modules"しますが、以下をcmakeファイルとして使用すると、期待どおりに機能します。

cmake_minimum_required(VERSION 2.6)

project(program)

exec_program(pkg-config ARGS --cflags gtk+-2.0 OUTPUT_VARIABLE GTK_FLAGS)
exec_program(pkg-config ARGS --libs   gtk+-2.0 OUTPUT_VARIABLE GTK_LIBS)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GTK_FLAGS}")

add_executable(program
program.cpp
)

target_link_libraries(program
${GTK_LIBS}
)
于 2013-08-01T23:36:17.250 に答える