我有以下项目结构:
- 的CMakeLists.txt
- LIB1 /的CMakeLists.txt和的lib的所有CPP和头文件
- LIB2 /的CMakeLists.txt和的lib的所有CPP和头文件
- 应用程序/的CMakeLists.txt和应用程序的所有CPP和头文件
主要的CMakeLists.txt是这样的:
PROJECT( ${PROJECT_NAME} )
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)
在LIB1的CMakeLists.txt看起来EG /像(剥离):
SET(SOURCE
file.cpp
)
SET(HEADERS
some_lib_header.h
)
add_library( lib1 ${SOURCE} ${HEADERS} )
和一个用于应用程序看起来除了ADD_EXECUTABLE相同:
SET(SOURCE
main.cpp
)
SET(HEADERS
some_header.h
)
add_library( lib1 ${SOURCE} ${HEADERS} )
ADD_EXECUTABLE( app ${SOURCE} ${HEADERS} )
我发现安装工作以及这种方式,因为离开这里,我可以生成一个Visual Studio解决方案文件,它包含所有三个项目。 但我的问题是,我的应用程序包括LIB1的头文件(也LIB2,这取决于lib1内的)。 当我做
$mkdir build
$cd build
$cmake -C ..\myproject
它产生乱源VS .sln文件,因为我想它,但应用程序不编译,因为它无法找到LIB1的头文件(显然)。
现在,我已阅读并尝试了很多东西,比如TARGET_LINK_LIBRARIES( app lib1 )
其中得到了应用与LIB1链接,却解决不了头包括发布),事情就是这样add_subdirectory( ../lib1 )
在CMakeLists各种变种应用程序的.TXT(全部倒掉,我无法修复错误),也find_package(我的猜测是错误的做法)。
那么,如何才能解决这个(我想简单......)的问题?
这里是一个可能的解决方案:
根的CMakeLists.txt:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(${PROJECT_NAME})
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)
LIB1 /的CMakeLists.txt:
project(Lib1)
add_library(lib1 lib1.cpp lib1.h)
LIB2 /的CMakeLists.txt:
project(Lib2)
add_library(lib2 lib2.cpp lib2.h)
# Add /lib1 to #include search path
include_directories(${Lib1_SOURCE_DIR})
# Specify lib2's dependency on lib1
target_link_libraries(lib2 lib1)
应用程序/的CMakeLists.txt:
project(App)
add_executable(app main.cpp some_header.h)
# Add /lib1 and /lib2 to #include search path
include_directories(${Lib1_SOURCE_DIR} ${Lib2_SOURCE_DIR})
# Specify app's dependency on lib2.
# lib2's dependency on lib1 is automatically added.
target_link_libraries(app lib2)
有很多不同的方式在这里实现相同的最终结果。 对于一个相对较小的项目,我可能只使用一个单一的CMakeLists.txt:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(Test)
add_library(lib1 lib1/lib1.cpp lib1/lib1.h)
add_library(lib2 lib2/lib2.cpp lib2/lib2.h)
add_executable(app app/main.cpp app/some_header.h)
include_directories(${CMAKE_SOURCE_DIR}/lib1 ${CMAKE_SOURCE_DIR}/lib2)
target_link_libraries(lib2 lib1)
target_link_libraries(app lib2)
有关相关命令及其理由进一步信息,请运行:
cmake --help-command add_subdirectory
cmake --help-command include_directories
cmake --help-command target_link_libraries
Project
CMakeLists.txt
\-lib1
CMakeLists.txt
\- include \ lib1
\- src
\-lib2
CMakeLists.txt
\- include \ lib2
\- src
\-app
CMakeLists.txt
\- src
假设依赖关系如下:
lib1 ---> lib2 ---> app
\--------------> app
事情是这样的:
的CMakeLists.txt:
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)
LIB1 /的CMakeLists.txt:
file(GLOB_RECURSE _HDRS "include/*.hpp")
file(GLOB_RECURSE _SRCS "src/*.[hc]pp")
add_library(lib1 ${_HDRS} ${_SRCS})
#target_link_libraries(lib1)
target_include_directories(lib1 PUBLIC include)
install(TARGETS lib1 DESTINATION lib)
install(FILES ${_HDRS} DESTINATION include/lib1)
LIB2 /的CMakeLists.txt:
file(GLOB_RECURSE _HDRS "include/*.hpp")
file(GLOB_RECURSE _SRCS "src/*.[hc]pp")
add_library(lib2 ${_HDRS} ${_SRCS})
target_link_libraries(lib2 lib1)
target_include_directories(lib2 PUBLIC include)
install(TARGETS lib2 DESTINATION lib)
install(FILES ${_HDRS} DESTINATION include/lib2)
所以在LIB2 / src目录/ file.cpp你可以做#include <lib1/header.hpp>
应用程序/的CMakeLists.txt:
file(GLOB_RECURSE _SRCS "src/*.[hc]pp")
add_executable(app ${_SRCS})
target_link_libraries(app lib1 lib2)
install(TARGETS app DESTINATION bin)
所以在应用/ src目录/ file.cpp你可以做#include <lib1/header.hpp>
和#include <lib2/header.hpp>
神奇的是target_include_directories其中附上“包括”目录复制到目标,所以它链接时,你拉include目录也;)