cmake简单配置文件示例 现在我有了一个自己的自己,我想在另一个CGED C++项目中使用它。它就这样存在于我的电脑里 ${MY_LIB_PATH}\include ${MY_LIB_PATH}\lib\x86\debug\lib-files ${MY_LIB_PATH}\lib\x86\release\lib-files ${MY_LIB_PATH}\lib\x64\debug\lib-files ${MY_LIB_PATH}\lib\x64\release\lib-files
一个基本的配置文件是什么样的,使CMakecmake简单配置文件示例 现在我有了一个自己的自己,我想在另一个CGED C++项目中使用它。它就这样存在于我的电脑里 ${MY_LIB_PATH}\include ${MY_LIB_PATH}\lib\x86\debug\lib-files ${MY_LIB_PATH}\lib\x86\release\lib-files ${MY_LIB_PATH}\lib\x64\debug\lib-files ${MY_LIB_PATH}\lib\x64\release\lib-files,c++,cmake,C++,Cmake,一个基本的配置文件是什么样的,使CMakefind\u package知道这些?我希望它会非常简单,因为它只是没有太多的信息提供 抱歉,我决定复制源代码,所以我不知道应该接受哪个答案。也许这可以稍微轻一点。还有这个或者。最后一个可能是最简单的 希望没有增加更多的痛苦:-) 以下文档应给出大致如下内容(假设您的库是mylib): MyLib/MyLibConfig.cmake.in MyLib/MyLibConfigVersion.cmake.in main MyLib/CMakeLists.tx
find\u package
知道这些?我希望它会非常简单,因为它只是没有太多的信息提供
抱歉,我决定复制源代码,所以我不知道应该接受哪个答案。也许这可以稍微轻一点。还有这个或者。最后一个可能是最简单的
希望没有增加更多的痛苦:-)
以下文档应给出大致如下内容(假设您的库是mylib
):
MyLib/MyLibConfig.cmake.in
MyLib/MyLibConfigVersion.cmake.in
main MyLib/CMakeLists.txt
在库的根目录中放置一个“${libname}-config.cmake”
然后在该文件中添加导入的目标
libprotobuf有一个例子
add_library(libprotobuf STATIC IMPORTED GLOBAL)
set_target_properties(libprotobuf PROPERTIES
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/prebuilt/android/${ANDROID_ABI}/libprotobuf.a"
IMPORTED_LINK_INTERFACE_LIBRARIES "${ZLIB_LIBRARIES};${CMAKE_THREAD_LIBS_INIT}"
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/src")
将Env或CMake变量“${libname}\u DIR”设置为“${MY\u LIB\u PATH}”
使用它
find_package(${libname})
#.......
target_link_libraries(main ${libname})
不要自己写配置文件;使用CMake的
export
命令。它太宽泛了,无法在这里全部涵盖,但这里有一个来自我的一个项目的修改示例:
install(TARGETS
your_target
EXPORT YourPackageConfig
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
export(TARGETS
your_target
NAMESPACE YourPackage::
FILE "${CMAKE_CURRENT_BINARY_DIR}/YourPackageConfig.cmake"
)
install(EXPORT
YourPackageConfig
DESTINATION "${CMAKE_INSTALL_DATADIR}/YourPackage/cmake"
NAMESPACE YourPackage::
)
这将为您创建配置文件,以便其他项目可以通过find\u package
使用它
find_package(YourPackage REQUIRED)
target_link_libraries(foo YouprPackage::your_target)
这将自动处理导入的
目标,还允许您嵌入编译器标志,包括路径、库依赖项,甚至哪些文件是接口的一部分(基本上是属于接口
属性的任何文件)。您看过了吗?您确定这行得通吗?export命令的手册中说“此命令创建的文件特定于构建树,因此不应安装”。事实上,如果我尝试这样做,我会收到一条错误消息,说“文件…是由export()命令生成的。它可能不是用install()命令安装的”。@GeorgP哪个命令给了你这个问题?export
(${CMAKE\u CURRENT\u BINARY\u DIR}/YourPackageConfig.CMAKE
)创建的文件与正在安装的文件不同(${CMAKE\u INSTALL\u DATADIR}/YourPackage/CMAKE
)。啊,是的,我错了。但是你的PackageConfig.cmake到底是用来做什么的呢?这个代码段将创建两个文件,都名为yourpackegeconfig.cmake
,只是在不同的位置。由export
创建的软件包允许其他软件包使用您的工件,而无需先安装它们,尽管我从未在简短的测试之外使用过它;我发现make&&makeinstall
更干净,它与我正在使用的任何软件包的更常见用法相匹配。啊,这真是太棒了!这正是我想要实现的,为用户提供这两个选项。但是,如果用户试图在不安装库的情况下使用库,那么他的CMakeList.txt文件会是什么样子呢?相同的?或者他会使用add_subdirectory
而不是find_package()?为什么他们会这么糟糕(医生)?Thx btw——简单且有效。另外,我建议使用CMAKE\U CURRENT\U LIST\U DIR而不是CMAKE\U CURRENT\U SOURCE\U DIR,以使此子项目可重新定位。
find_package(${libname})
#.......
target_link_libraries(main ${libname})
install(TARGETS
your_target
EXPORT YourPackageConfig
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
export(TARGETS
your_target
NAMESPACE YourPackage::
FILE "${CMAKE_CURRENT_BINARY_DIR}/YourPackageConfig.cmake"
)
install(EXPORT
YourPackageConfig
DESTINATION "${CMAKE_INSTALL_DATADIR}/YourPackage/cmake"
NAMESPACE YourPackage::
)
find_package(YourPackage REQUIRED)
target_link_libraries(foo YouprPackage::your_target)