不同package間調用.h文件和鏈接lib.so庫的方法

參考鏈接:https://blog.csdn.net/weixin_43651761/article/details/85557291

在ROS平臺上進行開發時,同一個workspace下,希望在新建的package中引用原有的package中的生成的.so庫和.h文件。

將自己遇到的問題及解決方案描述如下:

自定義兩個package,名字分別爲packageA和packageB,假設由packageA調用packageB中的相關頭文件和生成的庫文件。

1 不同package間對.h文件的調用

假設packageB中被調用的文件爲packageB/testB.h。

若此時在packageA的主調文件packageA/testA.h中添加#include <packageB/testB.h>,並進行catkin_make編譯,會有如下報警:

#include <packageB/test.h>

報警:

 fatal error: packageB/testB.h: No such file or directory
#include <packageB/testB.h>

處理步驟:

(1)packageB,此時的CMakeLists.txt文件中,catkin_package()項爲

catkin_package(
  CATKIN_DEPENDS
  message_runtime
)

修改爲

catkin_package(
  INCLUDE_DIRS include (添加)
  CATKIN_DEPENDS
  message_runtime
)

(2)packageA,此時的CMakeLists.txt文件中,find_package()項爲

find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  std_msgs
)

修改爲

find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  std_msgs
  packageB(添加)
)

另外,include_directories需至少包含如下配置

include_directories(
  include ${catkin_INCLUDE_DIRS}
)

(3)packageA,package.xml文件中添加對packageB的依賴

  <build_depend>packageB</build_depend>
  <build_export_depend>packageB</build_export_depend>
  <exec_depend>packageB</exec_depend>

此時再進行catkin_make的編譯,可以則可以編譯通過。

2 不同package間對.so庫文件的調用

此時用.so庫進行類readBin對象聲明時,有如下報警,以read_bin爲例

read_bin::readBin reda_bin_test_ = new read_bin::readBin()

編譯報警:

CMakeFiles/packageA.dir/src/packageA_2.cpp.o: In function `function()':
packageA_2.cpp:(.text+0x81f): undefined reference to `read_bin::readBin::readBin()'
collect2: error: ld returned 1 exit status
make[2]: *** [**] Error 1
make[1]: *** [**] Error 2
make: *** [all] Error 2
Invoking "make -j4 -l4" failed

處理步驟:
(1)packageB,生成庫文件,以read_bin爲例

add_library(read_bin
  include/packageB/read_bin.h
  src/read_bin.cpp
)
add_dependencies(read_bin ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(read_bin
  ${catkin_LIBRARIES}
)

(2)按 “1 不同package間對.h文件的調用”步驟配置好相關參數

(3)packageA,CMakeLists.txt中對需要鏈接read_bin庫的可執行文件或庫進行鏈接配置,package_lib可執行文件爲例

add_dependencies(package_lib ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(package_lib read_bin
  ${catkin_LIBRARIES}
)

此時再進行編譯,可以正常編譯完成。

注:鏈接lib庫的方法,在同一個package下同樣適用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章