Ранее я использовал эту библиотеку в виде add_subdirectory(../NeLib ${CMAKE_CURRENT_BINARY_DIR}/NeLib)
Теперь Я надеюсь, что после того, как я предоставлю NeLibConfig.cmake, другие проекты смогут использовать его напрямую через find_package
Структура проекта:
NeLib
File.cppm
Image.cppm
... (Некоторые другие библиотеки, все являются файлами cppm)
CMakeLists.txt
NeLibConfig. cmake.in
Содержимое файла CMakeLists.txt:
cmake_minimum_required(VERSION 3.29)
project(NeLib)
set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
set(VERSION "1.0.0")
set(CMAKE_CXX_STANDARD 23)
find_package(OpenCV REQUIRED)
add_library(NeLib STATIC )
file(GLOB module_files "*.cppm")
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/NeLibConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/NeLibConfig.cmake"
@ONLY
)
target_sources(NeLib
PUBLIC
FILE_SET cxx_modules TYPE CXX_MODULES FILES
${module_files}
)
install(TARGETS ${PROJECT_NAME} DESTINATION /usr/lib EXPORT ${PROJECT_NAME} FILE_SET cxx_modules)
install(EXPORT ${PROJECT_NAME} DESTINATION /usr/lib/cmake/NeLib/)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/NeLibConfig.cmake"
DESTINATION "${test_INSTALL_DIR}/lib/cmake/NeLib/")
Содержимое файла NeLibConfig.cmake.in:
@PACKAGE_INIT@
set(NeLib_VERSION "1.0.0")
set(NeLib_SOVERSION "1.0")
find_library(NeLib_LIBRARIES
NAMES libNeLib.a
HINTS ${CMAKE_INSTALL_PREFIX}/lib/${PROJECT_NAME}
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(NeLib
REQUIRED_VARS NeLib_LIBRARIES
VERSION_VAR NeLib_VERSION
)
if(NeLib_FOUND)
add_library(NeLib::NeLib INTERFACE IMPORTED)
set_target_properties(NeLib::NeLib PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}"
IMPORTED_LOCATION "${NeLib_LIBRARIES}"
INTERFACE_LINK_LIBRARIES "OpenCV::opencv_core"
)
endif()
Затем устанавливаем эту библиотеку:
- cd NeLib && mkdir build && cd build
- cmake .. -G Ninja -DCMAKE_CXX_COMPILER=/usr/bin/clang++
- cmake --build .
- sudo cmake -- установить .
-- Install configuration: ""
-- Up-to-date: /usr/lib/libNeLib.a
-- Up-to-date: /usr/lib/Image.cppm
-- Up-to-date: /usr/lib/cmake/NeLib/NeLib.cmake
-- Up-to-date: /usr/lib/cmake/NeLib/NeLib-noconfig.cmake
-- Installing: /lib/cmake/NeLib/NeLibConfig.cmake
Используйте эту библиотеку в новом проекте:
CMakeLists.txt
cmake_minimum_required(VERSION 3.29)
project(untitled)
set(CMAKE_CXX_STANDARD 23)
find_package(NeLib REQUIRED)
add_executable(untitled
main.cpp
)
target_link_libraries(untitled
NeLib
)
main.cpp
import Image;
int main () {
nl::Image image("../desk.png");
image.show("show");
return 0;
}
Ошибка компиляции:
/opt/clion/bin/cmake/linux/x64/bin/cmake --build /home/yongheng/Projects/untitled/cmake-build-debug --target untitled -j 10
[3/4] Building CXX object CMakeFiles/untitled.dir/main.cpp.o
FAILED: CMakeFiles/untitled.dir/main.cpp.o
/usr/bin/clang++ -g -std=gnu++23 -fcolor-diagnostics -MD -MT CMakeFiles/untitled.dir/main.cpp.o -MF CMakeFiles/untitled.dir/main.cpp.o.d @CMakeFiles/untitled.dir/main.cpp.o.modmap -o CMakeFiles/untitled.dir/main.cpp.o -c /home/yongheng/Projects/untitled/main.cpp
/home/yongheng/Projects/untitled/main.cpp:1:8: fatal error: module 'Image' not found
1 | import Image;
| ~~~~~~~^~~~~
1 error generated.
ninja: build stopped: subcommand failed.
Подробнее здесь: https://stackoverflow.com/questions/791 ... 20-modules
Мобильная версия