CMake:依赖于第三个库

时间:2017-09-27 11:58:16

标签: c++ matlab boost cmake point-cloud-library

我正在尝试编译一个项目,我正在链接两个库(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

添加Matlab
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;
}

任何可以帮助我解决问题的方法都将受到高度赞赏。

0 个答案:

没有答案