关于堆栈溢出有很多类似的问题,但是没有一个可以回答我的问题。
我有一个使用CMake构建的C ++库:
mylib
| - CMakeLists.txt
| - src/
| | - m.h
| | - m.cpp
| - include/
| | - mylib/
| | | - a.h
| | | - something/
| | | | - some.h
| - cmake/
| - mylibConfig.cmake.in
| - mylibConfigVersion.cmake.in
然后我创建另一个包含上述库的库或可执行文件:
myapp
| - CMakeLists.txt
| - src/
| | - main.cpp
| - include/
| | - myapp/
| | | - b.h
| - libs
| | - mylib
并且希望像这样在mylib
中使用myapp
。请注意如何将mylib
标头包含在格式如下的目录中:
#include <mylib/a.h>
#include <mylib/something/some.h>
mylib
应该在构建myapp
时构建,以便以下内容能够在没有任何其他构建步骤的情况下正常工作 :
$ cd myapp/build
$ cmake ..
$ make
这里是我已查看过的一些Stack Overflow帖子的列表。我尝试了每种方法,但它们根本不起作用:
答案 0 :(得分:0)
所以,我实际上是在我的一个项目中这样做的。
首先,该库需要使用ADD_LIBRARY()构建,但我假设您要这样做。
库的CMakeLists.txt中的 ADD_LIBRARY (${MyLibName} ${SOURCES})
这会将库添加到cmake的库列表中。
第二,使用
将库添加到项目中 target_link_libraries (${PROJECT_NAME} ${MyLibName})
在可执行文件的CMakeLists.txt中,与您放置add_executable (${PROJECT_NAME} ${SOURCES})
这将建立依赖关系链,以强制MyLibName在PROJECT_NAME之前显式构建。
答案 1 :(得分:0)
假设在描述的项目中,仅将mylib/include
目录中的头文件视为公开的文件:
CMakeLists.txt
的顶级mylib
必须包含:
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(mylib VERSION 0.1 LANGUAGES CXX)
add_library(${MyLibName} ${MyLib_SOURCES})
target_include_directories(${MyLibName}
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
)
这可确保包括mylib
的项目只能访问include/
目录中的文件。 include/
中的文件可以像#include <myfile.h>
那样使用,而include/mylib
中的文件(可以是常规约定)可以像#include <mylib/myfile.h>
那样使用。
CMakeLists.txt
的顶级myapp
应该包括:
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(myapp VERSION 0.1 LANGUAGES CXX)
add_subdirectory(libs/mylib)
add_executable(${MyAppName} ${MyApp_SOURCES})
target_link_libraries(${MyAppName} ${MyLibName}
使用add_subdirectory
可确保在mylib
之前构建myapp
,并且target_link_libraries
将mylib
添加到可执行文件中。
如Tzalumen所言,请确保您对CMake tutorials有所了解,并偏爱使用cmake --build .
而不是make
。