參考鏈接: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下同樣適用。