CMake - 同一项目中的应用程序/库之间的依赖项(标头)
我的项目结构如下:
- CMakeLists.txt
- lib1/CMakeLists.txt 以及lib的所有cpp和头文件
- lib2/CMakeLists.txt 和 lib 的所有 cpp 和头文件
- app/CMakeLists.txt 以及应用的所有cpp和头文件
主要的 CMakeLists.txt 看起来像:
The main CMakeLists.txt looks like:
PROJECT( ${PROJECT_NAME} ) add_subdirectory(lib1) add_subdirectory(lib2) add_subdirectory(app)
lib1/CMakeLists.txt 看起来像(已剥离):
The lib1/CMakeLists.txt looks eg like (stripped):
SET(SOURCE file.cpp ) SET(HEADERS some_lib_header.h ) add_library( lib1 ${SOURCE} ${HEADERS} )
除了 ADD_EXECUTABLE 之外,应用程序的外观相同:
and the one for the app looks the same except of ADD_EXECUTABLE:
SET(SOURCE main.cpp ) SET(HEADERS some_header.h ) add_library( lib1 ${SOURCE} ${HEADERS} ) ADD_EXECUTABLE( app ${SOURCE} ${HEADERS} )
我发现这种设置运行良好,因为这样,我可以生成一个包含所有这三个项目的 Visual Studio 解决方案文件.但我的问题是我的应用程序包含 lib1 的头文件(以及依赖于 lib1 的 lib2 的头文件).当我这样做时
I found the setup working well this way because out of this, I can generate one Visual Studio solution file which contains all those three projects. But my problem is that my app includes header files of lib1 (and also of lib2, which depends on lib1). When I do
$mkdir build $cd build $cmake -C ..myproject
它会根据我的需要生成源外的 VS .sln 文件,但应用程序无法编译,因为它找不到 lib1 的头文件(显然).
it generates out-of-source VS .sln file as I want it, but the app doesn't compile because it can't find the header files of lib1 (obviously).
现在我阅读并尝试了很多东西,例如
TARGET_LINK_LIBRARIES(app lib1 )
(它让应用程序与 lib1 链接,但没有解决标头包含问题),以及诸如之类的东西add_subdirectory( ../lib1 )
在应用程序的 CMakeLists.txt 中的各种变体中(所有这些都引发了我无法修复的错误),还有 find_package (我猜这是错误的方法).Now I read and tried many things, like
TARGET_LINK_LIBRARIES( app lib1 )
(which got the app to link with the lib1, but not solve the header include issue), and things likeadd_subdirectory( ../lib1 )
in various variants in the CMakeLists.txt of app (which all throwed errors that I couldn't fix), and also find_package (which I guess is the wrong approach).那么我该如何解决这个(我猜很简单......)问题?
So how can I solve this (I guess simple...) problem?
推荐答案
这是一种可能的解决方案:
Here's one possible solution:
根 CMakeLists.txt:
Root 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:
lib1/CMakeLists.txt:project(Lib1) add_library(lib1 lib1.cpp lib1.h)
lib2/CMakeLists.txt:
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)
app/CMakeLists.txt:
app/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:
There are plenty of different ways to achieve the same end result here. For a relatively small project, I'd probably just use a single 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)
有关相关命令及其原理的更多信息,请运行:
For further info on the relevant commands and their rationale, run:cmake --help-command add_subdirectory cmake --help-command include_directories cmake --help-command target_link_libraries
相关文章