Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cmake-未找到共享库的头文件_C++_Cmake_Shared Libraries_Header Files - Fatal编程技术网

C++ cmake-未找到共享库的头文件

C++ cmake-未找到共享库的头文件,c++,cmake,shared-libraries,header-files,C++,Cmake,Shared Libraries,Header Files,我正在制作一个自定义库,希望可以为用户安装。但是,当我尝试在cmake可执行文件中使用我自己的库时,我得到一个生成错误,表示找不到库头 库CMakeLists.txt: cmake_minimum_required(VERSION 3.16) project(mylibrary) include(GNUInstallDirs) set(CMAKE_CXX_STANDARD 14) # Register a library - This will created lib[xxx].so ad

我正在制作一个自定义库,希望可以为用户安装。但是,当我尝试在cmake可执行文件中使用我自己的库时,我得到一个生成错误,表示找不到库头

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(mylibrary)

include(GNUInstallDirs)

set(CMAKE_CXX_STANDARD 14)

# Register a library - This will created lib[xxx].so
add_library(mylibrary SHARED src/library.cpp)

configure_file(mylibrary.pc.in mylibrary.pc @ONLY)

# List the /include directory
target_include_directories(mylibrary PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>  
        $<INSTALL_INTERFACE:include>)

install(TARGETS mylibrary
        EXPORT mylibraryConfig
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

export(TARGETS mylibrary
        FILE "${CMAKE_CURRENT_BINARY_DIR}/mylibraryConfig.cmake")

install(EXPORT mylibraryConfig
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/mylibrary/cmake"
        NAMESPACE mylibraryConfig::)

install(
        DIRECTORY include
        DESTINATION ${CMAKE_INSTALL_PREFIX})

install(FILES ${CMAKE_BINARY_DIR}/mylibrary.pc
    DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
cmake_minimum_required(VERSION 3.16)
project(myexecutable)

set(CMAKE_CXX_STANDARD 14)

find_package(mylibrary REQUIRED)

add_executable(myexecutable src/main.cpp)

target_link_libraries(myexecutable PUBLIC mylibrary)

target_include_directories(myexecutable PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
可执行文件
CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(mylibrary)

include(GNUInstallDirs)

set(CMAKE_CXX_STANDARD 14)

# Register a library - This will created lib[xxx].so
add_library(mylibrary SHARED src/library.cpp)

configure_file(mylibrary.pc.in mylibrary.pc @ONLY)

# List the /include directory
target_include_directories(mylibrary PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>  
        $<INSTALL_INTERFACE:include>)

install(TARGETS mylibrary
        EXPORT mylibraryConfig
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

export(TARGETS mylibrary
        FILE "${CMAKE_CURRENT_BINARY_DIR}/mylibraryConfig.cmake")

install(EXPORT mylibraryConfig
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/mylibrary/cmake"
        NAMESPACE mylibraryConfig::)

install(
        DIRECTORY include
        DESTINATION ${CMAKE_INSTALL_PREFIX})

install(FILES ${CMAKE_BINARY_DIR}/mylibrary.pc
    DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
cmake_minimum_required(VERSION 3.16)
project(myexecutable)

set(CMAKE_CXX_STANDARD 14)

find_package(mylibrary REQUIRED)

add_executable(myexecutable src/main.cpp)

target_link_libraries(myexecutable PUBLIC mylibrary)

target_include_directories(myexecutable PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
我可以为该项目准备cmake:

$ cmake .. -DCMAKE_PREFIX_PATH=~/libraries/local # Use non-standard location
然而,构建它失败了:

$ make
fatal error: mylibrary/library.h: No such file or directory
    2 | #include <mylibrary/library.h>
$make
致命错误:mylibrary/library.h:没有这样的文件或目录
2 |#包括
据我所知,库的位置(二进制文件和头文件)嵌入在已安装的包中。通过
find_package()
检索到的信息,为什么在这里不起作用

类似问题:

cmake_minimum_required(VERSION 3.16)
project(mylibrary)

include(GNUInstallDirs)

set(CMAKE_CXX_STANDARD 14)

# Register a library - This will created lib[xxx].so
add_library(mylibrary SHARED src/library.cpp)

configure_file(mylibrary.pc.in mylibrary.pc @ONLY)

# List the /include directory
target_include_directories(mylibrary PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>  
        $<INSTALL_INTERFACE:include>)

install(TARGETS mylibrary
        EXPORT mylibraryConfig
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

export(TARGETS mylibrary
        FILE "${CMAKE_CURRENT_BINARY_DIR}/mylibraryConfig.cmake")

install(EXPORT mylibraryConfig
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/mylibrary/cmake"
        NAMESPACE mylibraryConfig::)

install(
        DIRECTORY include
        DESTINATION ${CMAKE_INSTALL_PREFIX})

install(FILES ${CMAKE_BINARY_DIR}/mylibrary.pc
    DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
cmake_minimum_required(VERSION 3.16)
project(myexecutable)

set(CMAKE_CXX_STANDARD 14)

find_package(mylibrary REQUIRED)

add_executable(myexecutable src/main.cpp)

target_link_libraries(myexecutable PUBLIC mylibrary)

target_include_directories(myexecutable PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
  • 我的库cmake主要基于:
  • 同样的问题,但我已经在使用
    target\u include\u目录

如果配置文件中有共享库目标的名称空间,则在使用
查找包时,需要在下游包中引用其全名,即需要使用

target_link_libraries(myexecutable PUBLIC mylibraryConfig::mylibrary)
或者,通过替换从安装中删除命名空间

install(EXPORT mylibraryConfig
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/mylibrary/cmake"
        NAMESPACE mylibraryConfig::)
…与:

install(EXPORT mylibraryConfig
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/mylibrary/cmake")

据我所知,
find_package()
可能不会成功,甚至不会报告任何关于此的消息:。如果我为程序运行
cmake..
(没有
DCMAKE_PREFIX_PATH
),我会收到一个整洁的错误,如“找不到包mylibrary”。因此,我倾向于认为这一部分是有效的。当您在配置文件中命名共享库目标时,您需要在使用
find\u package
时使用它的全名,即在
target\u link\u libraries
命令中使用
mylibraryConfig::mylibrary
。是的,就是这样!我刚刚删除了
名称空间
位。如果你把这个作为答案贴出来,我会接受的。或者我自己稍后再发。