CMakeTutorial icon indicating copy to clipboard operation
CMakeTutorial copied to clipboard

如何引用Installation 中的库

Open ted8201 opened this issue 3 years ago • 3 comments

教程写得非常棒。在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 头文件,能帮我定位一下原因吗?

ted8201 avatar Mar 19 '21 12:03 ted8201

: fatal error: mymath.h: No such file or directory -- Installing: /opt/repos/cmake-tuts-repos/CMakeTutorial-master/Instal #include "mymath.h"

ted8201 avatar Mar 19 '21 12:03 ted8201

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
        )

mymath.h 不应设为private, 要给其他人作为库使用

ted8201 avatar Mar 21 '21 08:03 ted8201

感谢issue 文件中有这样一句,应该可以将头文件供他人使用

set_target_properties(mymath PROPERTIES PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/mymath.h)

BrightXiaoHan avatar Apr 02 '21 09:04 BrightXiaoHan