CMake:如何从目标链接列表中删除重复项?

Chr*_*ris 4 linker boost cmake point-cloud-library

我的链接器参数列表太长,此时我收到以下错误:

运行链接命令时出错:参数列表过长

我在应用程序中使用了不同的第三方库(包括Qt,OpenCV,PointCloudLibrary,VTK等),其中一些是我手动编译的,其他则是通过Homebrew在Mac OS X 10.7上安装的。

对于我的应用程序的实际构建设置,我使用CMake(2.8-9)。最近,我开始链接到PCL(PointCloudLibrary 1.6),这让我头疼,现在报告的错误。

我的CMake文件如下所示:

cmake_minimum_required(VERSION 2.6)
project(cmake_test)

add_definitions( -DBOOST_ALL_NO_LIB )

add_definitions( -DBOOST_ALL_DYN_LINK )

find_package(Boost COMPONENTS iostreams system filesystem regex thread date_time timer atomic locale graph exception REQUIRED)

if(Boost_FOUND)
    add_definitions("-DHAS_BOOST")
endif()

find_package(PCL REQUIRED)

include_directories(
    ${Boost_INCLUDE_DIRS}
    ${PCL_INCLUDE_DIRS}
)

link_directories(
    ${Boost_LIBRARY_DIRS}
    ${PCL_LIBRARY_DIRS}
)

add_definitions(
    ${PCL_DEFINITIONS}
)

add_executable(cmake_test cmake_test.cpp)

target_link_libraries(cmake_test
        ${Boost_LIBRARIES}
        ${PCL_COMMON_LIBRARIES}
        ${PCL_IO_LIBRARIES}
        ${PCL_FILTERS_LIBRARIES}
        ${PCL_FEATURES_LIBRARIES}
        ${PCL_GEOMETRY_LIBRARIES}
        ${PCL_SEGMENTATION_LIBRARIES}
        ${PCL_SURFACE_LIBRARIES}
        ${PCL_VISUALIZATION_LIBRARIES}
)
Run Code Online (Sandbox Code Playgroud)

主要问题似乎是目标链接库列表现在包含对所有boost库的多个引用。实际上,对于每个${PCL_***_LIBRARIES}完整${Boost_LIBRARIES}列表,都将一遍又一遍地添加。

我的问题是,如何从第三方库中删除作为依赖项出现的重复项,或者是否有人知道如何适当地处理此重复项。

请记住,我实际上正在使用此CMake中未列出的其他库(例如Qt,VTK),这些库会将更多项添加到目标链接列表中,最终使链接器无法处理。

谢谢!

Naf*_*man 5

尝试REMOVE_DUPLICATES列表操作:

list(REMOVE_DUPLICATES <list>)
Run Code Online (Sandbox Code Playgroud)

这将从您指定的列表中删除所有重复项。

请参阅CMake文档

  • 请注意,如果您的列表包含不同编译类型的链接状态,这可能会破坏正确的链接。在那种情况下,链接列表可能看起来像debug; liba-d; release; liba; debug; libb-d ...在这里,remove_duplicates将删除除首次出现的所有调试,release等之外的所有内容,这会导致垃圾链接程序命令。 (5认同)