我想将通过add_subproject
添加的项目相互链接。假设我有这样的项目结构:
(root)
I--exec
I--"some source files"
I--CMakeLists.txt
I--lib
I--"some source files"
I--CMakeLists.txt
I--CMakeLists.txt
有什么方法可以将我的根级别CMakeLists.txt排序为工作区文件?所以它的行为类似于Visual Studio的.sln
?
我试过这个,让你知道我的意思:
cmake_minimum_required(VERSION 2.8)
project(test)
add_subdirectory(exec)
add_subdirectory(lib)
target_link_libraries(exec lib)
target_include_directories(exec lib/include)
显然,它在倒数第二行抛出了一个配置错误,说明我不能这样做,因为exec不是由这个文件构建的(当前CMakeLists.txt
?)。有没有办法实现我想做的事情?
答案 0 :(得分:4)
对于CMake> = 2.8.10,target_link_libraries
和target_include_directories
的使用不正确。
他们应该指定目标SYSTEM | BEFORE | PUBLIC | INTERFACE | PRIVATE;在target_link_libraries
上以LINK_为前缀。
作为旁注,仅供明确的依赖管理(恕我直言):
在您的根CMakeLists.txt中,不应该有target_link_libraries
或target_include_directories
,它们应该在子项目中。因此,您的根CMakeLists应该是:
cmake_minimum_required(VERSION 2.8)
project(test)
add_subdirectory(lib)
add_subdirectory(exec)
在你的exec / CMakeLists.txt中:
add_executable (exec main.cpp)
target_link_libraries (exec LINK_PUBLIC lib)
target_include_directories (exec PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
在你的lib / CMakeLists.txt中:
add_library (lib libmain.cpp)
target_include_directories (lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
我不确定它是否有所作为,但我在可执行文件之前使用add_subdirectory
作为库。