首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake Target_Link_Libraries失败

CMake Target_Link_Libraries失败
EN

Stack Overflow用户
提问于 2013-09-12 13:45:56
回答 1查看 1.3K关注 0票数 0

我知道这个话题已经讨论过不止一次了,但我不明白到底出了什么问题。我查了几个网站,但没有一个提供的方法对我有用。

我想用CMake创建一个VS解决方案,该解决方案由10个项目组成。每个项目都必须链接myLibrary.lib

代码语言:javascript
复制
#CMakeLists.txt:

cmake_minimum_required (VERSION 2.8)
project (Project_Example) 

SET(SRC_DIR_PATH C++)

INCLUDE_DIRECTORIES( "inc" )                          # OK, tested and works
LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib)     # OK, tested and works
ADD_EXECUTABLE(${BINNAME} ${SRCS})                    # ?No idea?
TARGET_LINK_LIBRARIES(${BINNAME} myLibrary.lib)       # fails

ADD_SUBDIRECTORY( src/Project_01 )
IF( TRUE )
ADD_SUBDIRECTORY( src/Project_02 )
ADD_SUBDIRECTORY( src/Project_03 )
ADD_SUBDIRECTORY( src/Project_04 )
ADD_SUBDIRECTORY( src/Project_05 )
ADD_SUBDIRECTORY( src/Project_06 )
ADD_SUBDIRECTORY( src/Project_07 )
ADD_SUBDIRECTORY( src/Project_08 )
ADD_SUBDIRECTORY( src/Project_09 )
ADD_SUBDIRECTORY( src/Project_10 )
ENDIF()

每个项目都有自己的CMakeLists.txt,如下所示:

代码语言:javascript
复制
cmake_minimum_required (VERSION 2.8)

MESSAGE( STATUS "## ${CMAKE_CURRENT_BINARY_DIR} ##" )

IF ( ${CMAKE_SYSTEM_NAME} MATCHES "Windows" )
  ### Windows ###
  SET( LIB_PROJECT myLibrary )
  SET( LIB_SYSTEM  )
ELSEIF ( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" )
  ### Linux ###
  SET( LIB_PROJECT myLibrary dl )
  SET( LIB_SYSTEM /usr/local/lib )
ENDIF ( ${CMAKE_SYSTEM_NAME} MATCHES "Windows" )


SET( SOURCE_WITHOUT_EXT Project_01 )
SET( PROJECT_EXAMPLE ${SOURCE_WITHOUT_EXT} )

SET( SOURCE_FILES
  ${SOURCE_WITHOUT_EXT}.cpp
)


FOREACH( Librarys ${LIB_PROJECT} )
  MESSAGE("#### Librarys:${Librarys} next will find ...")
  SET( SHAREDLIB ${SHAREDLIB}-NOTFOUND )
  FIND_LIBRARY ( SHAREDLIB
    NAMES ${Librarys}
    PATHS ${PROJECT_BINARY_DIR}/lib ${LIB_SYSTEM}
    )
  MESSAGE("#### SHAREDLIB:${SHAREDLIB}")
  IF( SHAREDLIB )
    SET( LIBS_ALL ${LIBS_ALL} ${SHAREDLIB} )
    SET( SHAREDLIB ${SHAREDLIB}-NOTFOUND )
  ENDIF()
  MESSAGE("#### ${LIBRARY} found LIBS_ALL${LIBS_ALL}")
ENDFOREACH( Librarys )


ADD_EXECUTABLE( ${PROJECT_EXAMPLE} ${SOURCE_FILES} ) 

TARGET_LINK_LIBRARIES( ${PROJECT_EXAMPLE} ${LIBS_ALL})

来自这些项目的CMakeLists被长期使用,因此被认为是可以的。将所有项目集成到一个CMake解决方案时出现了问题。

我得到的错误是:“SHAREDLIB:SHAREDLIB-NOTFOUND”

`

还有一个警告:

代码语言:javascript
复制
CMake Warning (dev) at CMakeLists.txt: (TARGET_LINK_LIBRARIES): 
Cannot specify link libraries for target "MyLibrary.lib" which is not build by this project.

CMake does not support this but it is used to work accidentally ans is being allowed for compatibility.

Policy CMP0016 is not set: target_link_libraries() reports error if only argument is not a target. Run "cmake --help-policy CMP0016" for policy details. Use the cmake_policy command to set the policy and suppress this warning.

因此,我再次希望将这个库添加到该解决方案中的任何项目中。

我的文件夹类似于:

代码语言:javascript
复制
C++\
     inc\    -> header files
     lib\    -> libraries
     src\    -> sources with 10 different folders of c++ files

CMake命令是:

cmake -G "Visual Studio 10" --build .. -DWIN_64:BOOL=OFF

我使用的是CMake 2.8和VS 2010。

EN

回答 1

Stack Overflow用户

发布于 2013-09-13 09:56:51

解决这一问题的办法如下:

代码语言:javascript
复制
#CMakeLists.txt global:

cmake_minimum_required (VERSION 2.8)
project (Project_Example) 

SET(SRC_DIR_PATH C++)


ADD_SUBDIRECTORY( src/Project_01 )
IF( TRUE )
ADD_SUBDIRECTORY( src/Project_02 )
ADD_SUBDIRECTORY( src/Project_03 )
ADD_SUBDIRECTORY( src/Project_04 )
ADD_SUBDIRECTORY( src/Project_05 )
ADD_SUBDIRECTORY( src/Project_06 )
ADD_SUBDIRECTORY( src/Project_07 )
ADD_SUBDIRECTORY( src/Project_08 )
ADD_SUBDIRECTORY( src/Project_09 )
ADD_SUBDIRECTORY( src/Project_10 )
ENDIF()

如您所见,我从golbal CMakeLists中删除了包含和链接说明。相反,我将它们放入适当的CMakeLists文件中:

代码语言:javascript
复制
#CMakeLists.txt local (for each project):   

cmake_minimum_required (VERSION 2.8)        

MESSAGE( STATUS "## ${CMAKE_CURRENT_BINARY_DIR} ##" )    

SET(CMAKE_PROJECTNAME Project_01)    
SET(PROJECT_BINARY_DIR ../..)    

INCLUDE_DIRECTORIES( "${PROJECT_BINARY_DIR}/inc" )    


IF ( ${CMAKE_SYSTEM_NAME} MATCHES "Windows" )     
   ### Windows ###      
   SET( LIB_PROJECT MyLibrary )      
   SET( LIB_SYSTEM  )    
ELSEIF ( ${CMAKE_SYSTEM_NAME} MATCHES "Linux" )      
   ### Linux ###
  SET( LIB_PROJECT MyLibrary dl )      
   SET( LIB_SYSTEM /usr/local/lib/ )    
ENDIF ( ${CMAKE_SYSTEM_NAME} MATCHES "Windows" )

SET( SOURCE_WITHOUT_EXT Project_01 )    
SET( PROJECT_EXAMPLE ${SOURCE_WITHOUT_EXT} )    
SET( SOURCE_FILES
  ${SOURCE_WITHOUT_EXT}.cpp
)

FOREACH( Librarys ${LIB_PROJECT} )      
   MESSAGE("#### Librarys:${Librarys} next will find ...")      
   SET( SHAREDLIB ${SHAREDLIB}-NOTFOUND )      
   FIND_LIBRARY ( SHAREDLIB
    NAMES ${Librarys}
    PATHS ${PROJECT_BINARY_DIR}/lib ${LIB_SYSTEM}
    )

   MESSAGE("#### SHAREDLIB:${SHAREDLIB}")      
   IF( SHAREDLIB )        
      SET( LIBS_ALL ${LIBS_ALL} ${SHAREDLIB} )        
      SET( SHAREDLIB ${SHAREDLIB}-NOTFOUND )      
      ENDIF()
  MESSAGE("#### ${LIBRARY} found LIBS_ALL${LIBS_ALL}")    
ENDFOREACH( Librarys )

ADD_EXECUTABLE( ${PROJECT_EXAMPLE} ${SOURCE_FILES} ) 

TARGET_LINK_LIBRARIES( ${PROJECT_EXAMPLE} ${LIBS_ALL})

虽然这现在起作用了,但我仍然在问自己,如果我没有10个,而是100个项目呢?如果单独修改每个CMakeLists,这将是非常痛苦的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18766063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档