我无法使用CMake在另一个项目中导入共享库。
my-utils-lib
我的lib文件是在my-utils-lib项目中生成的:
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(my-utils-lib VERSION 1.0.0 DESCRIPTION "Utils for C++.")
set(CMAKE_CXX_STANDARD 14)
add_library(
my-utils-lib SHARED
./src/string_utils/find_matches.cpp
./src/string_utils/split.cpp
./src/string_utils/format.cpp
./src/vector_utils/print_vector.cpp
)
set_target_properties(
my-utils-lib PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1
)
target_include_directories(my-utils-lib PRIVATE src)
include(GNUInstallDirs)
install(
TARGETS my-utils-lib
DESTINATION ${CMAKE_INSTALL_LIBDIR}
EXPORT my-utils-lib
)
configure_file(my-utils-lib.pc.in my-utils-lib.pc @ONLY)
install(
FILES ${CMAKE_BINARY_DIR}/my-utils-lib.pc
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig
)
我运行mkdir build && cd ./build/ && cmake .. && sudo make install
以生成并安装我的库文件。
最后,my-utils-lib项目树看起来像这样:
CMakeLists.txt
my-utils-lib.pc.in
src/
|_main.cpp
|_main.h
|_string_utils/
|_find_matches.cpp
|_find_matches.h
|_format.cpp
|_format.h
|_split.cpp
|_split.h
|_vector_utils/
|_print_vector.cpp
|_print_vector.h
我的项目
[在另一个项目中,我想在本地标题之一中导入“ split.h”,而不必输入实际文件的完整路径。类似于:
#include "my-utils-lib/string_utils/split.h"
到目前为止,我尝试了许多解决方案,但没有一个起作用。我最后的尝试是:
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(longer_sub_sequence)
set(CMAKE_CXX_STANDARD 14)
find_package(Qt5Widgets REQUIRED)
find_library(my-utils-lib libmy-utils-lib.1.0.0.dylib)
add_library(my-utils-lib SHARED IMPORTED)
add_executable(
longer_sub_sequence
main.cpp
visualization/draw_matrix.cpp
visualization/draw_matrix.h
)
target_link_libraries(longer_sub_sequence my-utils-lib Qt5::Widgets)
CMake自动构建运行良好(我使用CLion作为IDE),但找不到如何从库中导入任何代码。
我检查了/ usr / local / lib(CMake在其中生成了我的lib文件,并找到了正确的lib文件:
find . -maxdepth 1 -name "*my-utils-lib*" -print
./libmy-utils-lib.1.0.0.dylib
./libmy-utils-lib.1.dylib
./libmy-utils-lib.dylib
我在这里想念什么?
您缺少安装库标题的信息。您应该为标头添加install
命令,就像对库二进制文件所做的一样。
此外,您应该考虑使用比较符号(<
和>
)代替include指令使用双引号:
#include <my-utils-lib/string_utils/split.h>
最后一句话,您正在生成并安装一个仅由pkg-config使用并且没有使用它的.pc
文件。