出问题的文件来自MemClickhouse目录下的MemClickhouse.h文件,出错的位置是:
#include "clickhouse/client.h"
报错的原因是找不到这个头文件,但是在子目录的cmake文件中,已经包含了这个头文件所在的路径:
add_library(${PROJECT_NAME} ${DIR_SRCS})
target_include_directories(${PROJECT_NAME} PRIVATE contribs/clickhouse-cpp/ contribs/clickhouse-cpp/contrib/absl)
target_link_libraries(${PROJECT_NAME} clickhouse-cpp-lib)
上面第二行就包含了这个头文件的路径,
当我用子目录的cmake文件单独构建这个子目录的时候,就能够正常生成我要的库文件。但是在父目录link这个库的时候,在MemClickhouse.h文件中却又会报错?
让我们看看父目录中的cmake是怎么写的:
cmake_minimum_required(VERSION 3.16)
project(Kline)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -pthread")
SET (MyDeps "/home/mydeps")
SET(INCS ${MyDeps}/include)
SET(LNKS ${MyDeps}/lib)
SET(LIBS
MemClickhouse
)
INCLUDE_DIRECTORIES(${INCS})
LINK_DIRECTORIES(${LNKS})
add_executable(Kline
app.cpp
RunTrader/PsiSubRunner.cpp
Time/time.cpp)
TARGET_LINK_LIBRARIES(Kline ${LIBS})
正常的链接了MemClickhouse库文件,看似没什么问题,但实际上由于我是使用Clion来构建的,Clion构建的库并不会放在MemClickhouse目录下,而是在cmake-build-debug目录下,所以下面的cmake代码找不到实际的库文件,所以父目录的cmake在构建时会根据头文件去构建,而不是库文件。
SET(LIBS
MemClickhouse
)
子目录的cmake是有告诉编译器去哪里找依赖的头文件的,但父目录不知道,因此就出现了文章一开头说明的错误。
其实这就是clion的问题,子目录构建的库的位置导致了父目录的cmake找不到库文件,所以在父目录的cmake文件加上这一行
add_subdirectory(MemClickhouse)
添加子目录,这样在构建时,就能找到所需库文件