4

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

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

我在我的应用程序中使用了不同的 3rd 方库(包括 Qt、OpenCV、PointCloudLibrary、VTK 等),其中一些是我手动编译的,另一些是我在 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}
)

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

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

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

谢谢!

4

2 回答 2

7

尝试REMOVE_DUPLICATES列表操作:

list(REMOVE_DUPLICATES <list>)

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

请参阅CMake 文档

于 2013-08-06T16:06:40.373 回答
0

一种可能的解决方案是简单地创建一个包含所有必需项的临时列表${PCL_***_LIBRARIES}并从该列表中删除所有${BOOST_LIBRARIES}项目:

[...]

foreach(i ${Boost_LIBRARIES})

list(REMOVE_ITEM PCL_ALL_REQUIRED_LIBRARIES ${i})

endforeach(i)

[...]

我更愿意实际查找和删除重复项,因为我只会用${Boost_LIBRARIES}这种方式删除重复项,但至少现在列表大小减少了。

于 2013-08-06T14:47:06.967 回答