我正在尝试编译一个项目,我正在链接两个库(PCL和Matlab)的预编译版本,这些库是针对不同版本的Boost(1.58和1.56)编译的。
当我构建项目时,这给了我很多警告:
Cannot generate a safe runtime search path for target Test because
files in some directories may conflict with libraries in implicit directories:
runtime library [libpng12.so.0] in /usr/lib/x86_64-linux-gnu may be hidden
by files in:
/usr/local/MATLAB/R2017b/bin/glnxa64
等其他库(libtiff,libfreetype,libexpat,libxml2,libQt5OpenGL ......),但没有提升。
当我编译并运行我的程序时,我收到此错误
*** Error in `/home/user/Test': free(): invalid pointer: 0x0000000000bf36a8 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f9cf1c507e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f9cf1c5937a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f9cf1c5d53c]
/lib/x86_64-linux-gnu/libc.so.6(__cxa_finalize+0x9a)[0x7f9cf1c1336a]
/usr/local/MATLAB/R2017b/bin/glnxa64/libboost_filesystem.so.1.56.0(+0x7646)[0x7f9ce9eda646]
我怀疑是因为它将所有库添加到同一个搜索路径,并将PCL链接到Matlab的Boost版本,从而提供错误和警告。我花了很多时间试图让它连接而不会崩溃,但无济于事。
灵感来自:link path confusion after target_link_libraries call
我尝试使用add_library
,
add_library(eng STATIC IMPORTED)
set_property(TARGET eng PROPERTY IMPORTED_LOCATION ${Matlab_ENG_LIBRARY})
set_property(TARGET eng PROPERTY INTERFACE_INCLUDE_DIRECTORIES /usr/local/MATLAB/R2017b/bin/glnxa64/)
target_link_libraries(${PROJECT_NAME} eng)
(以及这方面的许多变化)但我一直无法找到解决问题的组合,因为我也遇到了与提问者相同的问题。
似乎另一个问题是关于一个非常类似的问题,但它没有得到回答 MATLAB Libraries conflict with Existing Libraries - CMake Crash
我想我可以通过编译PCL并从头开始提升1.56来解决问题,但我想避免这种情况。
最小的“工作”示例:
CMakeLists.txt
project(Test)
cmake_minimum_required(VERSION 2.8)
add_executable(${PROJECT_NAME} main.cpp)
#PCL
find_package(PCL 1.3 REQUIRED COMPONENTS)
include_directories(${PCL_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${PCL_LIBRARIES})
#Matlab
find_package(Matlab REQUIRED ENG_LIBRARY)
include_directories(${Matlab_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${Matlab_ENG_LIBRARY})
main.cpp
#include <pcl/io/ply_io.h>
#include "engine.h"
int main() {
pcl::PLYReader ply_reader;
return 0;
}
void not_called_function() {
Engine *ep;
ep = engOpen("");
return;
}
任何可以帮助我解决问题的方法都将受到高度赞赏。