CMakeTutorial
CMakeTutorial copied to clipboard
如何引用Installation 中的库
教程写得非常棒。在Installation 中提到了“在其他项目中可以使用
find_package(MyMath 1.0)
target_linked_library(otherapp MyMath::mymath)
我在自己的工程中,这样编写的cmake
cmake_minimum_required(VERSION 3.0)
project(hi VERSION 0.1)
add_executable(hi main.cpp)
set(MyMath_DIR /opt/repos/cmake-tuts-repos/CMakeTutorial-master/Installation/build/mymath/lib/cmake/MyMath/)
find_package(MyMath)
if(MyMath_FOUND)
message("MyMath found")
target_include_directories(hi PUBLIC ${MyMath_INCLUDE_DIR})
message("include dir ${MyMath_INCLUDE_DIR}")
target_link_libraries(hi MyMath::mymath)
else(MyMath_FOUND)
message("MyMath not found")
endif(MyMath_FOUND)
无法找到对应mymath.h 头文件,能帮我定位一下原因吗?
: fatal error: mymath.h: No such file or directory -- Installing: /opt/repos/cmake-tuts-repos/CMakeTutorial-master/Instal #include "mymath.h"
cmake_minimum_required(VERSION 3.0)
project(Installation VERSION 1.0)
# 如果想生成静态库,使用下面的语句
# add_library(mymath mymath.cc)
# target_include_directories(mymath PUBLIC ${CMAKE_SOURCE_DIR}/include)
# 如果想生成动态库,使用下面的语句
add_library(mymath SHARED mymath.cc)
# target_include_directories(mymath PRIVATE ${CMAKE_SOURCE_DIR}/include)
target_include_directories(mymath PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> # <prefix>/include/mylib
)
# target_include_directories(mymath PUBLIC ${CMAKE_SOURCE_DIR}/include)
set_target_properties(mymath PROPERTIES PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/mymath.h)
# 生成可执行文件
add_executable(mymathapp mymathApp.cc)
target_link_libraries(mymathapp mymath)
# target_include_directories(mymathapp INTERFACE ${CMAKE_SOURCE_DIR}/include)
## 这句做了修改,参考 https://stackoverflow.com/questions/25676277/cmake-target-include-directories-prints-an-error-when-i-try-to-add-the-source
target_include_directories(mymathapp INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include> # <prefix>/include/mylib
)
# 改变安装路径可以使用下面的语句,Unix: "/usr/local", Windows: "c:/Program Files/${PROJECT_NAME}" 为默认值,所有的DESTINATION均以此目录为根目录
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/mymath)
# 写入库的版本信息
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
MyMathConfigVersion.cmake
VERSION ${PACKAGE_VERSION}
COMPATIBILITY AnyNewerVersion
)
# 将库文件,可执行文件,头文件安装到指定目录
install(TARGETS mymath mymathapp
EXPORT MyMathTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
PUBLIC_HEADER DESTINATION include
)
# 将库的相关信息输出为MyMathConfig.cmake,供find_package查找
install(EXPORT MyMathTargets
FILE MyMathTargets.cmake
NAMESPACE MyMath::
DESTINATION lib/cmake/MyMath
)
configure_file(MyMathConfig.cmake.in MyMathConfig.cmake @ONLY)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/MyMathConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/MyMathConfigVersion.cmake"
DESTINATION lib/cmake/MyMath
)
感谢issue 文件中有这样一句,应该可以将头文件供他人使用
set_target_properties(mymath PROPERTIES PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/mymath.h)