带有CMakeLists的ActiveMQ CMS

带有CMakeLists的ActiveMQ CMS,cmake,activemq,activemq-cpp,Cmake,Activemq,Activemq Cpp,我有一个项目,我想在其中使用activemq producer,因此我想在我的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_

我有一个项目,我想在其中使用activemq producer,因此我想在我的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.
有人知道如何将activemq与CMakeLists结合使用吗?或者有人知道如何将Makefile命令转换为CMakeLists命令吗?事实上,我认为问题在于我无法链接库,绝对路径对于CMake样式来说并不合适,我的意思是,我几乎可以肯定这不是给出这样路径的方式。

如果使用正确,CMake非常简单。但是,在CMakeLists.txt中硬编码本地路径在某种程度上违背了CMake的目的,即具有可移植配置。我还怀疑CMake在此上下文中未能正确评估
~

“正确”的做法是编写一个
FindActiveMQ.cmake
模块,并在命令行上使用
-DCMAKE_PREFIX_PATH=${HOME}/Tools/activemq-cpp-library-3.8.4
对其进行参数化,但我担心有关如何编写Find模块的说明将超出SO答案的范围。如果你认为你能胜任这项任务,那么就检查一下

我想向您指出,更具体地说,包装Find模块语法的技术细节,但我担心它采用了一种标准布局(在
../include
中包含文件,在
../lib
中包含库文件),而您的ActiveMQ安装似乎没有这种布局


如果你不太在意可移植性或可重用性,“黑客”的方法是直接在
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()

这是未经测试的;这基本上是对我在上面提到的package helper中所写内容的解释。如果它不能正常工作,您可能需要对它进行一些调整。

我找到了一种“黑客方式”,目前看来它正在工作。也就是说,使用set命令将上述路径定义为:
set(ACTIVEMQ_-CPP)/usr/local/lib/libactivemq-CPP.so”)
set(ACTIVEMQ_-INCLUDE_-DIR)/usr/local/INCLUDE/ACTIVEMQ-CPP-3.8.4/”
,然后在链接部分引用它们。@frageDE:我不会说这是对CMake的滥用;很明显,您希望它只在非常特定的环境中工作。但是请注意,你正在放弃所有使CMake优于make的东西。我有点惊讶;在问题中,您为ActiveMQ组件使用了非标准路径。在您的评论中,它是在系统范围内安装的。在这种情况下,请查看我在答案中链接的模块,并将它们自由地调整为您自己的
FindActiveMQ.cmake
模块,因为只需轻触
include
子菜单,即可清晰地工作。