2

我有一个项目,我想在其中使用 activemq 生产者,因此我想在我的 CMakeLists.txt 中添加 activemq 库。

以前,我使用的是 MakeFile,我有以下代码:

APR_INCLUDE=/usr/include/apr-1
CMS_HOME=$(HOME)/Tools/activemq-cpp-library-3.8.4
LD_LIBRARY_PATH:=/libs

obstacleDetection_cpp: src/obstacleDetection.cpp protoc_middleman
    g++ -I $(APR_INCLUDE) -I $(CMS_HOME)/src/main -g -o src/obstacleDetection.o -c src/obstacleDetection.cpp
    cd libs && cp $(CMS_HOME)/src/main/.libs/libactivemq-cpp.so.18.0.4 . && ln -sf libactivemq-cpp.so.18.0.4 libactivemq-cpp.so.18
    g++ -L $(CMS_HOME)/src/main/.libs/ -g -o bin/obstacleDetection src/obstacleDetection.o src-gen/VisionData.pb.cc src-gen/VisionData.pb.h -lactivemq-cpp -lssl -L/usr/local/lib -lprotobuf -pthread
    @echo "Success."

我将库路径设置为变量并在链接过程中引用它们。

然而,对于 CMakeLists,它并不是那么简单。我的 CMakeLists 中有以下部分,但它不起作用:

include_directories(
  ${catkin_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS} 
  ${PROTOBUF_INCLUDE_DIRS}
  ${CMAKE_CURRENT_BINARY_DIR}
  include
  ~/Tools/activemq-cpp-3.8.4
  /usr/include/apr-1
)


target_link_libraries(cameraSubscriber
   ${catkin_LIBRARIES}
   ${OpenCV_LIBRARIES}
   ${PROTOBUF_LIBRARIES}
   filters
   /usr/local/lib/libactivemq-cpp.a
   /usr/lib/libapr-1.a
 )

我收到以下错误:

fatal error: activemq/library/ActiveMQCPP.h: No such file or directory
compilation terminated.

有谁知道如何在 CMakeLists 中使用 activemq?或者任何人都知道如何将 Makefile 命令转换为 CMakeLists 命令?实际上我认为问题在于我无法链接库,那里的绝对路径对于 CMake 风格来说看起来不太好,我的意思是,我几乎可以肯定这不是给出这样的路径的方式。

4

1 回答 1

1

如果使用得当,CMake非常简单。在 CMakeLists.txt 中硬编码本地路径在某种程度上违背了 CMake 的目的,即具有可移植配置。我还怀疑 CMake~在这种情况下无法正确评估。

“正确”的做法是编写一个FindActiveMQ.cmake模块,并在命令行上使用 参数化它-DCMAKE_PREFIX_PATH=${HOME}/Tools/activemq-cpp-library-3.8.4,但我担心如何编写 Find Module 的说明会超出 SO 答案的范围。如果您认为自己能够胜任这项任务,请查看相关文档。

我会向您指出我自己的 CMake 框架,更具体地说是包装 Find Module 语法技术的包助手,但我担心它采用标准布局(包含文件.../include和库文件.../lib),您的 ActiveMQ 安装似乎没有具有。


如果您不太关心可移植性或可重用性,“hacky”方式是find_path()直接find_library()在您的CMakeLists.txt:

find_path( ActiveMQ_INCLUDE_DIR
           NAMES ActiveMQCPP.h
           HINTS $ENV{HOME}/Tools/activemq-cpp-3.8.4/
           PATH_SUFFIXES activemq/library
           DOC "ActiveMQ include files" )

find_library( ActiveMQ_LIBRARY
              NAMES activemq-cpp
              HINTS $ENV{HOME}/Tools/activemq-cpp-3.8.4/
              DOC "ActiveMQ library" )

然后,您应该添加一些检查:

if ( ActiveMQ_INCLUDE_DIR AND ActiveMQ_LIBRARY )
    include_directories( ${ActiveMQ_INCLUDE_DIR} )
    target_link_libraries( cameraSubscriber ${ActiveMQ_LIBRARY} )
else()
    message( FATAL_ERROR "..." )
endif()

那是未经测试的;它基本上是对我在上面提到的包助手中所写内容的解释。如果它不能按原样工作,您可能需要对其进行一些调整。

于 2015-09-21T08:48:04.067 回答