Gcc 如何更改cmake文件中LIB的顺序?

Gcc 如何更改cmake文件中LIB的顺序?,gcc,linker,cmake,pkg-config,Gcc,Linker,Cmake,Pkg Config,链接顺序问题。我观察到,当我使用以下工具编译程序时: gcc `pkg-config --cflags --libs gtk+-2.0` program.cpp -o program 这会产生大量链接器错误:“未定义对“\u gtk\u init\u abi\u check”的引用”等。这可以通过在库之前指定输入文件来解决 gcc program.cpp `pkg-config --cflags --libs gtk+-2.0` -o program 我的问题: 当我使用Cmake文件时,如

链接顺序问题。我观察到,当我使用以下工具编译程序时:

gcc `pkg-config --cflags --libs gtk+-2.0` program.cpp -o program
这会产生大量链接器错误:“未定义对“\u gtk\u init\u abi\u 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文件的部分内容,但似乎没有找到正确的顺序

啊哈!经过多次搜索和反复尝试,我终于在我的cmake文件
CMakeLists.txt
中添加了以下几行代码,使它能够正常工作:

target_link_libraries(program
${GTK2_PKG_FLAGS}
)
通过使用user2618142答案中的一些建议,我改进了它。由于某些原因,pkg_check_modules()函数对我不起作用。我得到了
未知的CMake命令“pkg\u check\u 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}
)

啊哈!经过多次搜索和反复尝试,我终于在我的cmake文件
CMakeLists.txt
中添加了以下几行代码,使它能够正常工作:

target_link_libraries(program
${GTK2_PKG_FLAGS}
)
通过使用user2618142答案中的一些建议,我改进了它。由于某些原因,pkg_check_modules()函数对我不起作用。我得到了
未知的CMake命令“pkg\u check\u 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}
)

您已经在命令中传递了参数
--cflags
--libs
,这将在一个变量中同时给出.pc文件的-I和-L部分

尝试运行
消息(“${GTK2\u PKG\u 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}) 

请参阅

您已经在命令中传递了参数
--cflags
--libs
,该命令将在一个变量中同时给出.pc文件的-I和-L部分

尝试运行
消息(“${GTK2\u PKG\u 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}) 

参考

您甚至注意到了我自己的答案,仍然提出改进。这是极好的信息,为我澄清了一些事情。出于某种原因,cmake说
未知的cmake命令“pkg\u check\u modules”
,但我至少改进了两个单独的exec\u程序调用:一个用于--cflags,另一个用于--libs。然后我在一个集合中使用GTK_CFLAGS(CMAKE_CXX_FLAGS…)命令,在目标链接库中使用GTK_LIBS(…)。我在答案中添加了“include”语句。这将解决发现的错误。但是,我已经发布了另一个问题的参考,你应该在那里查看。你甚至注意到了我自己的答案,并且仍然提供了改进。这是极好的信息,为我澄清了一些事情。出于某种原因,cmake说
未知的cmake命令“pkg\u check\u modules”
,但我至少改进了两个单独的exec\u程序调用:一个用于--cflags,另一个用于--libs。然后我在一个集合中使用GTK_CFLAGS(CMAKE_CXX_FLAGS…)命令,在目标链接库中使用GTK_LIBS(…)。我在答案中添加了“include”语句。这将解决发现的错误。但是,我已经发布了对另一个问题的引用,你应该在那里查看。