带有 CMakeLists 的 ActiveMQ CMS
ActiveMQ CMS with CMakeLists
我有一个项目,我想在其中使用 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."
我将库路径设置为变量并在 linking 过程中引用它们。
但是,对于 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 命令吗?实际上我认为问题是我无法 link 库,那里的绝对路径看起来不符合 CMake 风格,我的意思是,我几乎可以肯定这不是给出这样的路径的方式。
如果使用得当,CMake 非常 简单明了。尽管在 CMakeLists.txt 中对本地路径进行硬编码在某种程度上违背了 CMake 的目的,即具有 可移植 配置。我还怀疑 CMake 在这种情况下未能正确评估 ~
。
"right" 要做的是编写一个 FindActiveMQ.cmake
模块,并在命令行上使用 -DCMAKE_PREFIX_PATH=${HOME}/Tools/activemq-cpp-library-3.8.4
对其进行参数化,但我担心有关如何编写 Find 的说明模块将超出 SO 答案的范围。如果您认为自己可以胜任这项任务,请查看 documentation。
我会向您指出 my own CMake framework, more specifically the package helper 包含 Find Module 语法的技术细节,但恐怕它采用标准布局(在 .../include
中包含包含文件,在 [=16= 中包含库文件]),你的 ActiveMQ 安装似乎没有。
如果您不太关心可移植性或可重用性,"hacky" 方法是直接在您的 CMakeLists.txt
:
中使用 find_path()
and find_library()
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()
那是未经测试的;它基本上是我在上面提到的包助手中写的内容的解释。如果它不能按原样工作,您可能需要稍微调整一下。
我有一个项目,我想在其中使用 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."
我将库路径设置为变量并在 linking 过程中引用它们。
但是,对于 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 命令吗?实际上我认为问题是我无法 link 库,那里的绝对路径看起来不符合 CMake 风格,我的意思是,我几乎可以肯定这不是给出这样的路径的方式。
CMake 非常 简单明了。尽管在 CMakeLists.txt 中对本地路径进行硬编码在某种程度上违背了 CMake 的目的,即具有 可移植 配置。我还怀疑 CMake 在这种情况下未能正确评估 ~
。
"right" 要做的是编写一个 FindActiveMQ.cmake
模块,并在命令行上使用 -DCMAKE_PREFIX_PATH=${HOME}/Tools/activemq-cpp-library-3.8.4
对其进行参数化,但我担心有关如何编写 Find 的说明模块将超出 SO 答案的范围。如果您认为自己可以胜任这项任务,请查看 documentation。
我会向您指出 my own CMake framework, more specifically the package helper 包含 Find Module 语法的技术细节,但恐怕它采用标准布局(在 .../include
中包含包含文件,在 [=16= 中包含库文件]),你的 ActiveMQ 安装似乎没有。
如果您不太关心可移植性或可重用性,"hacky" 方法是直接在您的 CMakeLists.txt
:
find_path()
and find_library()
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()
那是未经测试的;它基本上是我在上面提到的包助手中写的内容的解释。如果它不能按原样工作,您可能需要稍微调整一下。