我有一个这样的目录:
Структура папок
Серийный номер тома: C85A-2EBA
C:.
│ CMakeLists.txt
│
├───build
├───example
│ app.cpp
│
├───shape
│ CMakeLists.txt
│ printer.h
│ shape.cpp
│ shape.h
│
└───square
CMakeLists.txt
info.h
square.cpp
square.h
我想编译两个 dll(shapelib、squarelib),但尚未将它们的函数导出到客户端的 app.cpp。
根 CMakeLists.txt 如下所示:
cmake_minimum_required(VERSION 3.25)
project(geometry LANGUAGES CXX)
if(MSVC)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
add_library(shapelib SHARED)
add_library(squarelib SHARED)
target_include_directories(squarelib PRIVATE ${PROJECT_SOURCE_DIR})
add_subdirectory("square")
target_include_directories(shapelib PRIVATE ${PROJECT_SOURCE_DIR})
add_subdirectory("shape")
shape文件夹中的CMakeLists.txt:
target_sources(shapelib
PRIVATE shape.cpp
PUBLIC FILE_SET HEADERS
BASE_DIRS ${PROJECT_SOURCE_DIR}/shape # если не писать "/shape", то include в square.h придется писать полностью
FILES shape.h)
方形文件夹中的 CMakeLists.txt:
target_sources(squarelib
PRIVATE square.cpp info.h
PUBLIC FILE_SET HEADERS
BASE_DIRS ${PROJECT_SOURCE_DIR}
FILES square.h)
头文件square.h:
//#include"shape/shape.h" // этот include работает как надо
#include"shape.h"
class Square: public Shape
{
public:
virtual std::string GetName() override;
void WriteInfo();
};
但编译时出现错误:fatal error C1083: Cannot open include file: 'shape.h': No such file or directory
但是,如果您使用带注释的 include 且不执行 do BASE_DIRS ${PROJECT_SOURCE_DIR}/shape
,那么一切都会按预期进行。但我想使用 cmake 以缩短的方式(按名称)连接标头。
如果我使用显式指定头文件的路径,为什么会出现错误FILE_SET HEADERS BASE_DIRS ${PROJECT_SOURCE_DIR}/shape FILES shape.h
尝试
FILE_SET HEADERS
使用PUBLIC
or代替INTERFACE
。shape文件夹中的 CMakeLists.txt
方形文件夹中的 CMakeLists.txt
如果我正确地解释了我在互联网上读到的内容,那么事实证明 BASE_DIR 应该指向与 target_include_directory 中相同的目录,即 ${PROJECT_SOURCE_DIR} 没有花哨的东西