0

我有一个使用CMake在Linux上生成 Makefile的 C 应用程序。该应用程序包含.c以及.proto文件。现在我需要生成.pb-c.c并在其中.pb-c.h使用protoc命令CMakeLists.txt以便当我执行cmake .cmake 时生成相应的 .pb-c 和 .pb-h。协议用作:

execute_process(COMMAND bash -c "${PROTOC_PATH} --c_out=${CMAKE_CURRENT_SOURCE_DIR}/ --proto_path=${PROTO_DIR}/ ${PROTO_DIR}/*.proto")

问题是我的 protoc 二进制文件和相关.so文件不在/usr/bin and /usr/libor中/usr/local/bin and /usr/local/lib。它们位于项目内的目录中 -$HOME/project-name/dependencies/bin/protoc and $HOME/project-name/dependencies/lib/libprotobuf.so.12

因此,我收到错误 -加载共享库时出错:libprotobuf.so.12:无法打开共享对象文件:没有这样的文件或目录

但是,如果我给出的命令为

execute_process(COMMAND bash -c "protoc--c_out=${CMAKE_CURRENT_SOURCE_DIR}/ --proto_path=${PROTO_DIR}/ ${PROTO_DIR}/*.proto")然后运行cmake .它可以正常工作,因为链接器能够从中获取.so文件/usr/lib

下面提到的是我的 CMakeLists.txt 文件的一部分

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath=${PROTOC_LIB_PATH} -L${PROTOC_LIB_PATH} -lprotobuf")

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-rpath=${PROTOC_LIB_PATH} -L${PROTOC_LIB_PATH} -lprotobuf")

execute_process(COMMAND bash -c "${PROTOC_PATH} --c_out=${CMAKE_CURRENT_SOURCE_DIR}/ --proto_path=${PROTO_DIR}/ ${PROTO_DIR}/*.proto")

但由于上述错误,它不起作用。

对于那些可能会说这是重复的人,我已经调查并尝试了以下 SO 问题:

使用 CMake 打开链接器标志

我不明白 -Wl,-rpath -Wl,

CMake 链接到外部库

cmake 有类似 target_link_options 的东西吗?

CMAKE RPATH 不工作 - 找不到共享对象文件

https://serverfault.com/q/279068/435497

如何使用 CMake 为库添加链接器标志?

https://serverfault.com/a/926072/435497

4

2 回答 2

2

如果你没有特殊的用例,你不需要自己调用 protoc。让 CMake 为你做这件事。

看看:https://cmake.org/cmake/help/v3.16/module/FindProtobuf.htmlCmake :在自定义目录中找到 protobuf 包

于 2020-01-01T11:46:13.570 回答
0

我发现这个链接有一个脚本,显示如何创建一个 PROTOBUF_GENERATE_C 函数,然后可以使用该函数生成.pb-cabd.pb-h文件。

从上面的脚本中,我得到了使用类似于find_library的find_program的想法,它允许您传递选项,以便 CMake 在上述路径中查找所需的程序。PATHS/PATH

于 2020-01-01T18:38:05.550 回答