【发布时间】:2013-09-12 13:45:56
【问题描述】:
我知道这个话题已经讨论了不止一次,但我不明白出了什么问题。我查了几个网站,但提供的方法都不适合我。
我想用 CMake 创建一个包含 10 个项目的 VS 解决方案。 每个项目必须链接myLibrary.lib。
#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,如下所示:
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"
`
还有一个警告:
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.
同样,我想将此库添加到此解决方案中的任何项目中。
我的文件夹是这样的:
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。
【问题讨论】:
-
看起来像是错字 -
$(BINNAME)应该是${BINNAME}? -
@Fraser 你是对的,谢谢。但现在又出现了一个错误:
LIB-NOTFOUND -
你在哪里得到这个错误?
-
@arrowdodger
cmake -G "Visual Studio 10" --build .. -DWIN_64:BOOL=OFF -
@fiscblog 在您的 CMakeLists.txt 中的哪个位置出现此错误?您发布的代码甚至没有变量
SHAREDLIB。你能为我们整理一个SSCCE吗?否则会变成猜谜游戏。