在非标准目录的 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 应用程序使用 CMake 在 Linux 上生成 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?
如果你没有特殊的用例,你不需要自己调用protoc。让 CMake 为您做这件事。
看看:https://cmake.org/cmake/help/v3.16/module/FindProtobuf.html
和 Cmake : 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 在提到的路径中查找所需的程序。
我有一个 C 应用程序使用 CMake 在 Linux 上生成 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?
如果你没有特殊的用例,你不需要自己调用protoc。让 CMake 为您做这件事。
看看:https://cmake.org/cmake/help/v3.16/module/FindProtobuf.html 和 Cmake : 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 在提到的路径中查找所需的程序。