我有一個結構如下的專案:
project/
├─ src/
│ ├─ main.cpp
│ ├─ CMakeLists.txt
├─ lib/
│ ├─ libapi.so
├─ CMakeLists.txt
├─ dep/
│ ├─ api/
│ │ ├─ api_types.h
在主要的 CMakeLists 我有:
add_subdirectory(dep)
add_executable("my_${PROJECT_NAME}")
add_subdirectory(src)
src在檔案夾內的 CMakeLists 中:
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
add_library(api SHARED IMPORTED)
set_property(TARGET api PROPERTY IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/lib/libapi.so")
target_sources("my_${PROJECT_NAME}" PRIVATE main.cpp)
在 main.cpp 中,我這樣做#include <api_types.h>了,但在編譯期間出現此錯誤:
api_types.h: No such file or directory
我該如何解決?
uj5u.com熱心網友回復:
首先——
add_subdirectory實際上只是CMakeLists.txt在指定的目錄中尋找將規則的子集應用到父專案。如果指定的檔案夾不包含任何CMakeLists.txt內容,則此命令不執行任何操作(即 commandadd_subdirectory(dep))。第二 -
target_include_directories期望一個目標物件鏈接(而不是專案名稱)。假設${PROJECT_NAME}不是您的任何目標的名稱(并且問題中給出的代碼僅顯示兩個目標my_${PROJECT_NAME},并且api)該命令target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})沒有任何意義。最后 - 您沒有在任何地方指定實際標題的路徑。
CMAKE_CURRENT_SOURCE_DIR指CMakeLists.txt所在的當前檔案夾。您應該指定標題所在檔案夾的路徑。
將所有上述資訊放在一起,頂級 CMakeLists.txt 所需的內容應該是這樣的:
cmake_minimum_required(VERSION 3.20)
set(PROJECT_NAME Hello)
project(${PROJECT_NAME})
add_executable(my_${PROJECT_NAME})
add_subdirectory(src)
而對于 src 的檔案,它顯然是這樣的:
target_include_directories(my_${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/dep/api)
target_sources(my_${PROJECT_NAME} PRIVATE main.cpp)
但是,此解決方案無法解決您的代碼中的另一個錯誤 - 您提供的 CMake 檔案不會將庫本身鏈接到可執行目標。然而,這不是所問的問題,對于社區成員,我建議在這里參考另一個相關問題的答案。
uj5u.com熱心網友回復:
target_include_directories需要您的可執行檔案作為目標,在這種情況下為my_${PROJECT_NAME}.
你可以試試
target_include_directories(my_${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
作為替代方案,我建議采用以下結構
project/
├─ src/
│ ├─ main.cpp
├─ lib/
│ ├─ libapi.so
├─ CMakeLists.txt
├─ include/
│ ├─ api/
│ │ ├─ api_types.h
使用以下 CMakeList.txt
add_executable(my_${PROJECT_NAME} src/main.cpp)
target_include_directories(my_${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
link_directories(${CMAKE_SOURCE_DIR}/lib)
target_link_libraries(my_${PROJECT_NAME} libapi)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/513859.html
標籤:C 制作
