【发布时间】:2021-10-17 16:06:48
【问题描述】:
我正在尝试将预编译的 so 文件链接到我在 cmake 中的可执行文件。我不确定我是否误解了如何使用共享库,但我假设一旦我编译了共享库,任何应用程序都可以链接到它并使用它的功能。编译可执行文件时,我收到此错误:
logger.h: No such file or directory
#include "logger.h"
^~~~~~~~~~
compilation terminated.
这是我的可执行文件的 cmake 文件
cmake_minimum_required(VERSION 2.8)
# specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# set PROJECT home directory
set(PROJECT_HOME "/opt/PROJECT")
# set the project name
project(ClServer)
# add the executable
add_executable(ClServer server.cpp)
add_library(logger SHARED IMPORTED libClLogger.so)
message ("Here")
set_target_properties(logger
PROPERTIES IMPORTED_LOCATION "#{PROJECT_HOME}/base"
)
target_link_libraries(ClServer
${Logger}
)
我也尝试过使用find_library 并使用target_link_libraries 添加到共享库的绝对路径,但出现了同样的错误。
这是我的记录器共享库的 cmake 文件:
cmake_minimum_required(VERSION 2.8)
# specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# set Clamor home directory
set(PROJECT_HOME "/opt/PROJECT")
# set the project name
project(ClLogger)
# set boost paths
set(Boost_NO_SYSTEM_PATHS TRUE)
if (Boost_NO_SYSTEM_PATHS)
set(BOOST_ROOT "${PROJECT_HOME}/ext/Boost/boost_1_76_0")
set(BOOST_LIBRARYDIR "${PROJECT_HOME}/ext/Boost/boost_1_76_0/stage/lib")
set(BOOST_INCLUDEDIR "${PROJECT_HOME}/ext/Boost/boost_1_76_0")
endif (Boost_NO_SYSTEM_PATHS)
# provides the linker with the appropriate directories and components
find_package(Boost 1.76.0 COMPONENTS log log_setup thread filesystem system)
if(Boost_FOUND)
include_directories(${BOOST_INCLUDEDIR})
link_directories(${BOOST_LIBRARYDIR})
endif()
message (STATUS Boost_LIBRARIES:)
message (STATUS ${Boost_LIBRARIES})
message (STATUS BOOST_INCLUDEDIR:)
message (STATUS ${BOOST_INCLUDEDIR})
# add PROJECT source code libraries
add_library(ClLogger SHARED logger.cpp)
# link the appropriate libraries
target_link_libraries(ClLogger
libpthread.so.0
${Boost_LIBRARIES}
)
# redirect binaries to base folder
set_target_properties(ClLogger
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_HOME}/base"
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_HOME}/base"
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_HOME}/base"
)
【问题讨论】:
-
您需要添加 include 目录,其中包含所需的标头 (
logger.h)。您可以按照that question 的答案通过“通用方式”来做到这一点。或者你可以通过你拥有的导入库目标来做到这一点,使用属性INTERFACE_INCLUDE_DIRECTORY,类似于that question。 -
另请注意,在 CMake 中 targets 和 variables 是不同的东西。表达式
${Logger}取消引用您从未定义的Loggervariable。而是使用target_link_libraries(ClServer Logger)与 IMPORTED target 链接。