【发布时间】:2016-07-05 21:40:25
【问题描述】:
我正在尝试使用 cmake 将“Skeltrack”安装到共享库中。这是我的项目分支:https://github.com/birgersp/Skeltrack/tree/cmake
据我了解,target_include_directories 使包能够“保存”它所需的标头位置,因此使用我的库的应用程序不必包含该目录即可运行库。这是正确的吗?
似乎如果我的库需要一些标头,我需要在我的应用程序中包含这些标头,即使我在我的库中使用了target_include_directories...
库的 CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(Skeltrack)
# Set output folders
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)
# Find source files
file(GLOB SOURCES src/*.c)
# Include header files
include_directories(include)
# Create shared library
add_library(${PROJECT_NAME} STATIC ${SOURCES})
# Include Glib library
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
find_package(Glib REQUIRED)
target_link_libraries(${PROJECT_NAME} ${Glib_LIBRARIES})
target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC ${Glib_INCLUDE_DIRS})
# Install library
install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME})
# Install library headers
file(GLOB HEADERS include/*.h)
install(FILES ${HEADERS} DESTINATION include/${PROJECT_NAME})
我的应用程序的 CMakeListst.txt
cmake_minimum_required(VERSION 2.4.0)
project(skeltrack-test)
# Find source files
file(GLOB SOURCES src/*.cpp)
# Create executable
add_executable(${PROJECT_NAME} ${SOURCES})
# Find and link Skeltrack library
find_library(SKELTRACK Skeltrack PATH_SUFFIXES Skeltrack)
target_link_libraries(${PROJECT_NAME} ${SKELTRACK})
# Find and include Skeltrack library headers
find_path(SKELTRACK_INCDLUDE_DIRS skeltrack.h PATH_SUFFIXES Skeltrack)
target_include_directories(${PROJECT_NAME} PUBLIC ${SKELTRACK_INCDLUDE_DIRS})
制作输出:
[ 50%] Building CXX object CMakeFiles/skeltrack-test.dir/src/main.o
In file included from /usr/local/include/Skeltrack/skeltrack-skeleton.h:26:0,
from /usr/local/include/Skeltrack/skeltrack.h:26,
from /home/birger/Workspace/skeltrack-test/src/main.cpp:2:
/usr/local/include/Skeltrack/skeltrack-joint.h:26:18: fatal error: glib.h: No such file or directory
compilation terminated.
CMakeFiles/skeltrack-test.dir/build.make:62: recipe for target 'CMakeFiles/skeltrack-test.dir/src/main.o' failed
make[2]: *** [CMakeFiles/skeltrack-test.dir/src/main.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/skeltrack-test.dir/all' failed
make[1]: *** [CMakeFiles/skeltrack-test.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
似乎我需要在我的应用程序中包含 Glib 头目录才能使库运行?如何避免两次包含标题?
【问题讨论】:
-
带有
target_include_directories()的自传播包含目录仅适用于创建的真实目标,例如find_package()不是find_library()。 -
我想我必须将 Skeltrack 库作为一个包安装,还是有其他方法可以解决这个问题?
-
我不确定您到底想要完成什么。 Making cmake library accessible by other cmake packages automatically 之类的东西?
-
我正在尝试构建我的应用程序,而不必包含库所需的标头目录。这些标头应该在我构建库时包含在内,但我不明白为什么不包含这些标头。
-
让我尝试改写:如何构建我的库,以便它可以找到它需要在我的应用程序中运行的标头?
标签: c++ cmake dependencies