CMake FIND_PACKAGE成功但返回错误的路径

时间:2012-03-30 18:16:27

标签: c++ boost cmake

我正在尝试使用CMakeLists.txt中的以下代码将CMake 2.8.6链接到boost :: program_options

FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES (${Boost_INCLUDE_DIR})

ADD_EXECUTABLE (segment segment.cpp)
TARGET_LINK_LIBRARIES (segment ${Boost_LIBRARIES})

find命令似乎成功但将错误的目录传递给链接器。该包实际上在:

`/usr/lib64/libboost_program_options-mt.so.5`

CMakeFiles/segment.dir/link.txt列出了以下内容:

/cm/shared/apps/gcc/4.4.6/bin/c++       CMakeFiles/segment.dir/segment.cpp.o  -o segment -rdynamic /usr/lib64/lib64/libboost_program_options-mt.so.5 -lpthread -lrt -Wl,-rpath,/usr/lib64/lib64

请注意路径中的额外lib64。此外,路径前面的-l标志似乎缺失。

运行CMake时,它报告它正确找到了包,{$Boost_LIBRARIES}变量似乎列出了正确的库:

Boost  found.
Found Boost components:
   program_options
${Boost_LIBRARIES} - optimized;boost_program_options-mt-shared;debug;boost_program_options-mt-shared-debug

生成的CMakeCache.txt文件以:

开头
//The directory containing a CMake configuration file for Boost.
Boost_DIR:PATH=/usr/lib64/boost

//Boost include directory
Boost_INCLUDE_DIR:FILEPATH=/usr/include

这似乎是正确的。但是在运行make时,它使用上面link.txt中的路径,我得到错误:

make[2]: *** No rule to make target `/usr/lib64/lib64/libboost_program_options-mt.so.5', needed by `segment'.  Stop.
make[1]: *** [CMakeFiles/segment.dir/all] Error 2
make: *** [all] Error 2

什么可能导致这个额外注入一个子目录进入路径?什么可能导致以这种方式生成link.txt?我该如何修复它(或解决它?)

6 个答案:

答案 0 :(得分:25)

当使用cmake-2.8.6-rc2或更高版本的某些较旧版本的boost时,会发生此问题,其中boost包查找代码已更改。

可以通过在cmake命令行上指定-DBoost_NO_BOOST_CMAKE=ON来解决此问题。

引入此问题的实际提交是7da796d1fdd7cca07df733d010cd343f6f8787a9,可以是viewed here

答案 1 :(得分:7)

问题在于boost-devel分布式文件:/usr/lib64/boost/Boost-relwithdebinfo.cmake

cmake-2.6软件包根本不使用此文件,因为FindBoost.cmake文件返回(正确)完整路径来增强库。 cmake28-2.8.8 FindBoost.cmake文件返回类似“boost_date_time-mt-shared”的库字符串,这些字符串是/usr/lib64/boost/Boost-relwithdebinfo.cmake中定义的目标。

在/usr/lib64/boost/Boost-relwithdebinfo.cmake的最顶部,一个名为_IMPORT_PREFIX的变量是从cmake文件本身的位置定义的,然后像这样使用:

#----------------------------------------------------------------
# Generated CMake target import file for configuration "RelWithDebInfo".
#----------------------------------------------------------------

# Commands may need to know the format version.
SET(CMAKE_IMPORT_FILE_VERSION 1)

# Compute the installation prefix relative to this file.
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)

# Import target "boost_date_time-static" for configuration "RelWithDebInfo"
SET_PROPERTY(TARGET boost_date_time-static APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
SET_TARGET_PROPERTIES(boost_date_time-static PROPERTIES
  IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib64/libboost_date_time.a"
  )

这将_IMPORT_PREFIX设置为“/ usr / lib64”,它与另一个在其中包含/ lib64 /的字符串连接在一起。我发现如果我只是将文件更改为包含第三个GET_FILENAME_COMPONENT调用,它就可以正常工作。像这样:

#----------------------------------------------------------------
# Generated CMake target import file for configuration "RelWithDebInfo".
#----------------------------------------------------------------

# Commands may need to know the format version.
SET(CMAKE_IMPORT_FILE_VERSION 1)

# Compute the installation prefix relative to this file.
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)

# Import target "boost_date_time-static" for configuration "RelWithDebInfo"
SET_PROPERTY(TARGET boost_date_time-static APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
SET_TARGET_PROPERTIES(boost_date_time-static PROPERTIES
  IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib64/libboost_date_time.a"
  )

答案 2 :(得分:4)

这似乎与CentOS上的CMake 2.8.6有关。当使用2.6.4或2.8.3执行相同操作时,它可以正常工作。 OS X上的2.8.7也能正常工作。

答案 3 :(得分:3)

我也看到使用CentOS 64位6.2预编译的cmake版本2.8.8的问题

答案 4 :(得分:0)

我在cmake版本2.8.11.2上发现了这个问题,其中包含boost-1.41.0-18.el6.x86_64

批准的答案似乎并不令人满意,因为将此定义附加到我得到的cmake运行时:

CMake警告:   项目未使用手动指定的变量:

Boost_NO_BOOST_CMAKE

由于没有足够的参与stackoverflow,我似乎无法评论或downvote。这是鸡和蛋的问题!

我似乎也无法对凯梅耶的解释进行投票。但是,我认为这确实解释了这个问题。

从我收集的内容看来,总的来说,CMake提供的FindBoost.cmake似乎突然无法找到Boost,所以查找代码现在通过cmake的boost提供的脚本进行搜索,而cmake又提供了一个错误,似乎没有返回正确的路径。

答案 5 :(得分:0)

在从AUR构建带有前缀的软件包时,找到了提升

BOOST_ROOT=/usr

示例:

BOOST_ROOT=/usr makepkg -si