在非标准目录的 CMakeLists 中使用 protoc 会产生 "cannot open shared object file: No such file or directory" 错误

Using protoc inside CMakeLists from a non-standard directory gives "cannot open shared object file: No such file or directory" error

我有一个 C 应用程序使用 CMakeLinux 上生成 Makefile。该应用程序在 CMakeLists.txt 中包含 .c.proto files. Now I need to genearte .pb-c.c and .pb-c.h using protoc command,因此当我执行 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/lib/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 . 然后它工作正常,因为链接器能够从 /usr/lib

获取 .so 文件

下面提到的是我的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 问题:

Turning on linker flags with CMake

I don't understand -Wl,-rpath -Wl,

CMake link to external library

Does cmake have something like target_link_options?

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

How to add linker flag for libraries with CMake?

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

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

看看:https://cmake.org/cmake/help/v3.16/module/FindProtobuf.htmlCmake : find protobuf package in custom directory

我发现 this link 有一个脚本显示 如何创建一个 PROTOBUF_GENERATE_C 函数 然后可以用来生成.pb-c abd .pb-h 个文件。

从上面的脚本中我得到了利用 find_program which is similar to find_library 的想法,它允许您传递 PATHS/PATH 选项,以便 CMake 在提到的路径中查找所需的程序。