Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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 - Fatal编程技术网

C++ CMake在另一个库中包含库

C++ CMake在另一个库中包含库,c++,cmake,C++,Cmake,我有一个给定的项目结构 . ├── CMakeLists.txt ├── lib │   ├── lodepng │   │   ├── CMakeLists.txt │   │   └── src │   │   ├── lodepng.cpp │   │   └── lodepng.h │   └── pixel_reader │   ├── CMakeLists.txt │   └── src │   ├── hello.cpp │  

我有一个给定的项目结构

.
├── CMakeLists.txt
├── lib
│   ├── lodepng
│   │   ├── CMakeLists.txt
│   │   └── src
│   │       ├── lodepng.cpp
│   │       └── lodepng.h
│   └── pixel_reader
│       ├── CMakeLists.txt
│       └── src
│           ├── hello.cpp
│           └── hello.h
├── main.cpp

使用以下CMakeLists

/CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(pov_system VERSION 1.0)

add_subdirectory(lib/lodepng)
add_subdirectory(lib/pixel_reader)

add_executable(pov_system main.cpp)

target_link_libraries(pixel_reader PRIVATE lodepng)
target_link_libraries(pov_system PRIVATE pixel_reader)
add_library(
    lodepng
    src/lodepng.cpp
    src/lodepng.h
)

target_include_directories(lodepng PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
# create target
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_link_libraries(pixel_reader PRIVATE lodepng) #link library where target is created
target_include_directories(pixel_reader PUBLIC "../../lodepng/src/")

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
/lodepng/CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(pov_system VERSION 1.0)

add_subdirectory(lib/lodepng)
add_subdirectory(lib/pixel_reader)

add_executable(pov_system main.cpp)

target_link_libraries(pixel_reader PRIVATE lodepng)
target_link_libraries(pov_system PRIVATE pixel_reader)
add_library(
    lodepng
    src/lodepng.cpp
    src/lodepng.h
)

target_include_directories(lodepng PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
# create target
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_link_libraries(pixel_reader PRIVATE lodepng) #link library where target is created
target_include_directories(pixel_reader PUBLIC "../../lodepng/src/")

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
/pixel\u reader/CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(pov_system VERSION 1.0)

add_subdirectory(lib/lodepng)
add_subdirectory(lib/pixel_reader)

add_executable(pov_system main.cpp)

target_link_libraries(pixel_reader PRIVATE lodepng)
target_link_libraries(pov_system PRIVATE pixel_reader)
add_library(
    lodepng
    src/lodepng.cpp
    src/lodepng.h
)

target_include_directories(lodepng PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
# create target
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_link_libraries(pixel_reader PRIVATE lodepng) #link library where target is created
target_include_directories(pixel_reader PUBLIC "../../lodepng/src/")

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
可以看到,我尝试将“lodepng”库链接到“pixel_reader”库,并将“lodepng.h”包含到“hello.h”文件中。 但目前,我在尝试构建项目时出现了以下错误

[build] <path-to-project>/pov_system/lib/pixel_reader/src/hello.h:2:10: fatal error: lodepng.h: No such file or directory
[build]     2 | #include "lodepng.h"
[build]       |          ^~~~~~~~~~~
[build] compilation terminated.
[build]/pov_system/lib/pixel_reader/src/hello.h:2:10:致命错误:lodepng.h:没有这样的文件或目录
[build]2 |#包括“lodepng.h”
[建设]|^~~~~~~~~~~
[build]编译已终止。
问题

为什么我的代码找不到'lodepng.h'文件,或者(更重要的是)从一个库链接到另一个库是一种好的做法


也许有两个非常简单的问题,但刚刚开始深入到CMake、编译等领域。。。我非常感谢您的帮助。

您的pixel_reader库目标可能需要编译lodepng.h头,因为这取决于它

差不多

target_include_directories(pixel_reader PUBLIC "PATH_TO_LODE_PNG_HEADER_DIRECTORY")

无法解决此问题。

您的像素读取器库目标可能需要编译lodepng.h头,因为它依赖于它

差不多

target_include_directories(pixel_reader PUBLIC "PATH_TO_LODE_PNG_HEADER_DIRECTORY")
可以解决这个问题

为什么我的代码找不到'lodepng.h'文件或(甚至更重要的是)

因为你可能没有给它正确的路径。解决这个问题的一种方法是在
hello.h

#包括“../../lodepng/src/lodepng.h

第二种方法是使用
target\u include\u目录

target_include_directories(pixel_reader PUBLIC "../../lodepng/src/")
从一个图书馆链接到另一个图书馆是一种好的做法吗

这取决于你的项目。如果A库需要B库,那么是的,我认为没问题

更重要的是,您在错误的位置创建了目标,即在根CMakeLists文件中。必须在创建目标的目录中完成

/pixel\u reader/CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(pov_system VERSION 1.0)

add_subdirectory(lib/lodepng)
add_subdirectory(lib/pixel_reader)

add_executable(pov_system main.cpp)

target_link_libraries(pixel_reader PRIVATE lodepng)
target_link_libraries(pov_system PRIVATE pixel_reader)
add_library(
    lodepng
    src/lodepng.cpp
    src/lodepng.h
)

target_include_directories(lodepng PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
# create target
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_link_libraries(pixel_reader PRIVATE lodepng) #link library where target is created
target_include_directories(pixel_reader PUBLIC "../../lodepng/src/")

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
为什么我的代码找不到'lodepng.h'文件或(甚至更重要的是)

因为您可能没有给出正确的路径。解决此问题的一种方法是在
hello.h

#包括“../../lodepng/src/lodepng.h

第二种方法是使用
target\u include\u目录

target_include_directories(pixel_reader PUBLIC "../../lodepng/src/")
从一个图书馆链接到另一个图书馆是一种好的做法吗

这取决于你的项目。如果图书馆A需要图书馆B,那么是的,在我看来是可以的

更重要的是,您在错误的位置创建了目标,即在根CMakeLists文件中。必须在创建目标的目录中执行此操作

/pixel\u reader/CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(pov_system VERSION 1.0)

add_subdirectory(lib/lodepng)
add_subdirectory(lib/pixel_reader)

add_executable(pov_system main.cpp)

target_link_libraries(pixel_reader PRIVATE lodepng)
target_link_libraries(pov_system PRIVATE pixel_reader)
add_library(
    lodepng
    src/lodepng.cpp
    src/lodepng.h
)

target_include_directories(lodepng PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
# create target
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_link_libraries(pixel_reader PRIVATE lodepng) #link library where target is created
target_include_directories(pixel_reader PUBLIC "../../lodepng/src/")

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")

事实上,这是在耍花招。但是为什么我必须包括目录?如果我试图将pixle_reader包含到可执行文件中,则不必包含目录。将图书馆纳入其他图书馆是否被认为是一种良好的做法?嗯,有必要将lodepng.h纳入其中。您应该了解一些有关您将要使用的函数的接口和签名的信息。我经常看到的一种做法是将include公共include文件放在预定义的目录中,如./include。这是可能的,但通常不同的库做不同的事情。这里有一些有用的链接,谢谢你的帮助。我真的很感谢你的回答和提供的链接。事实上,它正在发挥作用。但是为什么我必须包括目录?如果我试图将pixle_reader包含到可执行文件中,则不必包含目录。将图书馆纳入其他图书馆是否被认为是一种良好的做法?嗯,有必要将lodepng.h纳入其中。您应该了解一些有关您将要使用的函数的接口和签名的信息。我经常看到的一种做法是将include公共include文件放在预定义的目录中,如./include。这是可能的,但通常不同的库做不同的事情。这里有一些有用的链接,谢谢你的帮助。我真的很感谢你的回答和提供的链接。如果pixel_reader依赖于loadpng,它应该在自己的CMakeList.txt中包含该依赖项本身,而不是依赖于pov_系统来完成。
target_link_库(pixel_reader PRIVATE lodepng)
必须在
pixel\u reader/CMakeLists.txt
文件中。您是否在第一次调用
目标链接库时尝试将
私有
更改为
公共
?e、 g.:
target\u link\u库(pixel\u reader PUBLIC lodepng)
如果pixel\u reader依赖于loadpng,那么它应该在自己的CMakeList.txt中包含该依赖项,而不是依赖于从pov\u系统中执行该依赖项。
target\u link\u库(pixel\u reader PRIVATE lodepng)
必须在
pixel\u reader/CMakeLists.txt
文件中。您是否在第一次调用
目标链接库时尝试将
私有
更改为
公共
?e、 g.:
目标链接库(像素阅读器公共链接)