【问题标题】:How do I change order of Libs in a cmake file?如何更改 cmake 文件中 Libs 的顺序?
【发布时间】:2013-08-01 19:25:58
【问题描述】:

链接顺序很重要。我观察到,当我编译我的程序时:

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 文件的某些部分,但我似乎没有找到正确的顺序。

【问题讨论】:

    标签: gcc linker cmake pkg-config


    【解决方案1】:

    您已在命令中传递了参数--cflags--libs,这将在一个变量中提供.pc 文件的-I 和-L 部分。

    尝试运行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

    【讨论】:

    • 您甚至注意到了我自己的回答,并且仍然提供了改进。这是极好的信息,并为我澄清了一些事情。出于某种原因,cmake 说 Unknown CMake command "pkg_check_modules",但我至少通过两个单独的 exec_program 调用改进了我所拥有的:一个用于 --cflags,一个用于 --libs。然后我在 set(CMAKE_CXX_FLAGS ...) 命令中使用 GTK_CFLAGS,在 target_link_libraries(...) 中使用 GTK_LIBS。
    • 我在答案中添加了“include”语句。那应该解决发现的错误。但是,我已经发布了对另一个问题的引用,你应该看看那里。
    【解决方案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}
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多