簡體   English   中英

使用多個頭文件使用 CMake 創建 C++ 共享庫

[英]Creating a C++ Shared Library with CMake using several headers

我是 CMake 的新手,我試圖在 Ubuntu 中開發一個共享庫。 我已經設法創建了一些基本的 CMakeLists.txt 文件,它允許我編譯一個非常簡單的庫,只有一個頭文件和一個源文件。

事實上,我的項目樹是:

.
├── CMakesList.txt
├── First.h
|
└── src
    └──First.cpp

我能夠使用這個答案來做 CMakeLists.txt 文件。

但是,然后我嘗試通過向庫中添加Second類來增加示例的復雜性。

現在,我的公共頭文件First.h也導入了include/Second.h 項目樹是這樣的:

.
├── CMakesList.txt
├── First.h
|
└── include
|    └──Second.h
|
└── src
    └──First.cpp
    └──Second.cpp

我對 CMakesList 文件進行了必要的更改,如下所示:

cmake_minimum_required(VERSION 3.1...3.15)

project(First VERSION 1.0 
              DESCRIPTION "It does very little"
              LANGUAGES CXX)

include(GNUInstallDirs)

add_library(First SHARED 
    src/First.cpp
    src/Second.cpp)

set_target_properties(First PROPERTIES
    VERSION ${PROJECT_VERSION}
    PUBLIC_HEADER First.h)

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

target_include_directories(First PRIVATE .)

install(TARGETS First
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

install(FILES ${CMAKE_BINARY_DIR}/First.pc
    DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)

並且這個文件也運行成功。 它構建了沒有錯誤的庫。

但是,現在,當我鏈接庫並在另一個項目中使用它時,它不會編譯,並給我以下錯誤:

 /usr/local/include/First.h:36: error: include/Second.h: No such file or directory
 #include "include/Second.h"
          ^~~~~~~~~~~~~~

所以我想我的問題是:

我如何還創建一個目錄(在這種情況下,在 /usr/local/include/),其中包含我的公共標頭請求的所有必要標頭(以及我的公共標頭請求的標頭可以請求的其他標頭) , 等等)? 在這種情況下,我想將“Include”目錄包含在我的公共標題所在的同一目錄中。

對不起,這個愚蠢的問題,我只是在探索!

提前致謝!

首先,您必須聲明所有標頭。 我不知道有什么方法可以使用 cmake 自動查找頭文件依賴項(並且GLOB不是一個選項)。 如果您懶惰,可以復制粘貼ls -1 include輸出。 或者,您可以創建gcc -MM First.h檢查輸出。

如果您只想在/usr/local/include/first安裝Second.h ,我認為下面的代碼應該可以工作:

install(FILES include/Second.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/first)

但是,也許所有標題都應該放在/usr/local/include/first ,一切都會更容易:

set_target_properties(First PROPERTIES
    VERSION ${PROJECT_VERSION}
    PUBLIC_HEADER "First.h;include/Second.h")
install(TARGETS First
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/first)

注意PUBLIC_HEADER接受一個參數,這個參數是一個列表。 語法PUBLIC_HEADER First.h include/Second.h (不帶雙引號)只會將First.h作為參數傳遞。 另請參閱: CMake:${} 和“${}”之間的區別

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM