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.:目标链接库(像素阅读器公共链接)