link path confusion after target_link_libraries call
Asked Answered
P

1

2

I have a cmake project where I want to add a class containing the matlab engine. For compiling it I need to include two libraries eng and mx, which I do by adding

target_link_libraries( ${TARGET} /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so)
target_link_libraries( ${TARGET} /usr/local/MATLAB/R2013b/bin/glnxa64/libmx.so)

to my CMakeLists.txt file.
However there are also lots of other old versions of libraries in /usr/local/MATLAB/R2013b/bin/glnxa64/, which seem to be automatically added to the path as well when calling the above command. I think this causes the compiler to not find my normal libraries anymore and produces an error.
How can I include only the two above libraries, and not all the others in the glnxa64 folder?


The warning shown after running cmake . :

CMake Warning at CMakeLists.txt:23 (add_executable):  
Cannot generate a safe runtime search path for target CCDWidget because
files in some directories may conflict with libraries in implicit
directories:  

runtime library [libboost_program_options.so.1.49.0] in /usr/lib may be hidden by files in:  
/usr/local/MATLAB/R2013b/bin/glnxa64  
runtime library [libboost_system.so.1.49.0] in /usr/lib may be hidden by files in:  
/usr/local/MATLAB/R2013b/bin/glnxa64  
runtime library [libboost_filesystem.so.1.49.0] in /usr/lib may be hidden by files in:  
/usr/local/MATLAB/R2013b/bin/glnxa64  
runtime library [libboost_regex.so.1.49.0] in /usr/lib may be hidden by files in:  
/usr/local/MATLAB/R2013b/bin/glnxa64  

Some of these libraries may not be found correctly.  

And the error message during linking:

Linking CXX executable CCDWidget  
/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined reference to `FT_Face_GetCharVariantIndex'  
/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined reference to `FT_Get_Advance'  
collect2: error: ld returned 1 exit status  
make[2]: ***  [CCDWidget] Error 1   
make[1]: *** [CMakeFiles/CCDWidget.dir/all] Error 2  
make: *** [all] Error 2  

Below is my full CMakeLists.txt file. Lines commented out with two ## are alternatives that I tried before and didn't solve my problem. I also added LINK_PRIVATE to the target_link_libraries command as shown in the code below, which didn't make a difference. The option PRIVATE alone seems to be not accepted by my cmake version, as it changed the error meassage to

/usr/bin/ld: cannot find -lPRIVATE  
collect2: error: ld returned 1 exit status  

When the #eng line is commented out, the compilation and linking works without errors (when calling the matlab engine is also commented out in Readout.cpp), so the error must be produced by that line.


#Specify the version being used as well as the language  
cmake_minimum_required(VERSION 2.6)  
##cmake_policy(SET CMP0003 NEW)  
#Name your project here  
project(CCDWidget)  
set(TARGET CCDWidget)  

set(MAIN_SOURCES CCDWidget.cpp main.cc CCDControl.cpp VideoWindow.cpp ImageWindow.cpp ThisMeasurement.cpp KineticSeries.cpp FastKinetics.cpp Readout.cpp)  

##SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)  

#set_source_files_properties(Readout.cpp PROPERTIES COMPILE_FLAGS "-I/usr/local/MATLAB/R2013b/extern/include -I/usr/local/MATLAB/R2013b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -I/usr/local/MATLAB/R2013b/extern/include/cpp -I/usr/local/MATLAB/R2013b/extern/include -DGLNXA64 -DGCC  -DMX_COMPAT_32 -DNDEBUG -Wno-effc++")  

find_package(Boost COMPONENTS program_options system filesystem regex REQUIRED)  
find_package(PkgConfig REQUIRED)  
pkg_check_modules(GTKMM gtkmm-3.0)  

include_directories( ${GTKMM_INCLUDE_DIRS} )  
include_directories( ${Boost_INCLUDE_DIR} )  
include_directories( ${PROJECT_SOURCE_DIR} )  
##link_directories(/usr/local/MATLAB/R2013b/bin/glnxa64)  
##target_link_libraries( ${TARGET} eng)  
##target_link_libraries( ${TARGET} mx)  

set(CMAKE_CXX_FLAGS "--std=c++11")  
add_executable( ${TARGET} ${MAIN_SOURCES} )  

target_link_libraries( ${TARGET} ${GTKMM_LIBRARIES} )  
target_link_libraries( ${TARGET} ${Boost_LIBRARIES} )  
target_link_libraries( ${TARGET} LINK_PRIVATE /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so)  # eng  
#target_link_libraries( ${TARGET} LINK_PRIVATE /usr/local/MATLAB/R2013b/bin/glnxa64/libmx.so ) # mx  
target_link_libraries( ${TARGET} andor )  
Ploy answered 11/6, 2014 at 11:2 Comment(0)
B
1

You could try using an imported target:

add_library(eng SHARED IMPORTED) 
set_property(TARGET eng PROPERTY IMPORTED_LOCATION /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so) 
... 
add_executable( ${TARGET} ${MAIN_SOURCES} ) 
... 
target_link_libraries(${TARGET} eng) 

For debugging you could try to build with "make VERBOSE=1".
This will show you the used gcc command line. CMake probably transforms your target_link_libraries command to something like:

g++ ... -L/usr/local/MATLAB/R2013b/bin/glnxa64 -leng ... 

gcc then finds some boost libraries in this folder.

Bless answered 11/6, 2014 at 14:33 Comment(2)
thank you for your suggestions, but unfortunately the same error still occurs, or if I change 'SHARED' into 'MODULE' or 'STATIC' and un-comment the engine calling function, the libraries are not found anymore, and errors like /usr/bin/ld: warning: libut.so, needed by /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so, not found (try using -rpath or -rpath-link) appearPloy
the verbose output is /usr/bin/c++ --std=c++11 ... /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so /usr/local/MATLAB/R2013b/bin/glnxa64/libmx.so -Wl,-rpath,/usr/local/MATLAB/R2013b/bin/glnxa64Ploy

© 2022 - 2024 — McMap. All rights reserved.