![](/img/trans.png)
[英]Xcode project that was generated by CMake is not show header file
[英]How do I properly import, into a parent CMake project, a Protobuf-generated .h file created in a dependency CMake project?
这是我的项目层次结构(简化):
+-- CMakeLists.txt
+-- party
| +-- CMakeLists.txt
| +-- include
| \-- src
| \-- party.cc
\-- super
+-- CMakeLists.txt
+-- include
| \-- super.h
\-- src
+-- super.cc
\-- super.proto
我有一个名为Super的库CMake项目,其中包含一些Google Protobuf代码。 super.proto
编译器使用源文件super.proto
来创建super.pb.cc
和super.pb.h
。 Super的CMakeLists.txt
看起来像这样:
cmake_minimum_required(VERSION 3.1)
project(Super)
find_package(Protobuf REQUIRED)
set(INCLUDE_DIR "include")
set(SRC_DIR "src")
add_definitions("-std=c++11")
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${INCLUDE_DIR})
include_directories(${PROTOBUF_INCLUDE_DIRS})
# === Super library ===
PROTOBUF_GENERATE_CPP(super_proto_srcs super_proto_incl ${SRC_DIR}/super.proto)
file(GLOB shared_srcs "${SRC_DIR}/*.cc")
add_library(super SHARED ${shared_srcs} ${super_proto_srcs})
target_link_libraries(super ${PROTOBUF_LIBRARIES})
# === Install and exports ===
set(${PROJECT_NAME}_INCLUDE_DIRS
${PROJECT_SOURCE_DIR}/include
CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
Super将成为名为libsuper.so
的共享库。 它具有一个依赖于super.pb.h
的头文件。
Party是使用libsuper.so
的二进制文件。 它并不关心Protobuf,至少不是直接关心。 它包含super.h
并调用其方法。 派对的CMakeLists.txt如下所示:
cmake_minimum_required(VERSION 3.1)
project(Party)
set(INCLUDE_DIR "include")
set(SRC_DIR "src")
add_definitions("-std=c++11")
include_directories(${INCLUDE_DIR})
include_directories(${Super_INCLUDE_DIRS})
# === Party binary ===
file(GLOB binary_srcs "${SRC_DIR}/*.cc")
add_executable(party ${binary_srcs})
target_link_libraries(party super)
在父目录级别,统一的CMakeLists.txt
如下所示:
cmake_minimum_required(VERSION 3.1)
project(SuperParty)
add_subdirectory(super)
add_subdirectory(party)
我可以自己构建Super,而不会出错。 Protobuf生成的文件也将创建libsuper.so
。 但是,当我尝试构建主项目SuperParty时,出现以下错误:
In file included from superparty/party/src/party.cc:1:0:
superparty/super/include/super.h:1:22: fatal error: super.pb.h: No such file or directory
该文件位于SuperParty的build/
目录中,称为build/super/super.pb.h
。 我的问题是我需要告诉Party包含此自动生成的文件,但是我不知道从何处获取该文件的路径,以便可以在Party的CMakeLists.txt
创建适当的行。 参与方实际上需要引用主项目正在使用的CMAKE_BINARY_PATH。
事实证明,可以在Party的CMakeLists.txt
使用一个名为Super_BINARY_DIR
的自动变量,但实际上,还有一种更好的方法。 我没有修改Party,后者已经从Super_INCLUDE_DIRS
获取了它的包含列表,而是向该Super创建供Party使用的包含列表中添加了一个CMAKE_CURRENT_BINARY_DIR
。 这是Super的CMakeLists.txt
的新结尾:
# === Install and exports ===
set(${PROJECT_NAME}_INCLUDE_DIRS
${CMAKE_CURRENT_BINARY_DIR}
${PROJECT_SOURCE_DIR}/include
CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.