2013-08-01 28 views
1

鏈接順序很重要。我觀察到,當我編譯我的程序有:如何更改cmake文件中的Lib的順序?

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}") 

現在,當我做了cmake接着是make我得到同樣的鏈接錯誤,上面第一行給了我,讓我知道我的連接問題嚴格相關的訂單。那麼如何在cmake文件中使用pkg-config時更改鏈接順序?我試過對我的cmake文件的部分進行重新排序,但我似乎沒有找到正確的順序。

回答

3

您已通過無論是在這將給雙方-I和-L部分在一個變量的.PC文件的命令的參數--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}) 

參考question

+0

你甚至注意到了我自己的答案,並仍然提供了改進。這是非常好的信息,爲我澄清了一些事情。出於某種原因,cmake說'未知的CMake命令「pkg_check_modules」',但我至少改進了我用兩個獨立的exec_program調用所做的改進:一個用於--cflags,另一個用於--libs。然後,我在一組(CMAKE_CXX_FLAGS ...)命令中使用GTK_CFLAGS,並在target_link_libraries(...)中使用GTK_LIBS。 – Octopus

+0

我在答案中加入了「include」語句。這應該可以解決找到的錯誤。但是,我已經發布了另一個問題的參考,你應該看看那裏。 – user2618142

1

啊哈!經過一番摸索和試錯我終於得到它通過添加以下行到我的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} 
)